视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Bullet(Cocos2dx)之使用cocos2dx测试PhysicsWorld3D
2020-11-09 07:19:49 责编:小采
文档


1.使用 Cocos 引擎建立工程,打开 cocosstudio 修改分辨率为 960*0 ,删掉背景图片 发布到vs 工程 1.打开 AppDelegate 设置分辨率,并运行 director-getOpenGLView()-setDesignResolutionSize(960,0, ResolutionPolicy :: EXACT_FIT ); 2.配置Bullet(win

1.使用Cocos引擎建立工程,打开cocos studio 修改分辨率为960*0,删掉背景图片


发布到vs工程

1.打开AppDelegate设置分辨率,并运行

director->getOpenGLView()->setDesignResolutionSize(960, 0, ResolutionPolicy::EXACT_FIT);

2.配置Bullet(win32)到cocos2dx

首先要将bullet3-master的头文件复制到cocos\frameworks\cocos2d-x\external\Bullet;具体方法请看

如下图Bullet3之交叉编译Android 复制头文件


4.将编译好的Bullet库(win32)release库复制到

Cocos\frameworks\cocos2d-x\prebuilt\win32下分别更名为

BulletCollision_vs2012.lib

BulletDynamics_vs2012.lib

BulletSoftBody_vs2012.lib

LinearMath_vs2012.lib

如何得到Bullet库,这个就要去看Bullet3之Hello World(vs2012)补充如何生成Bullet库

5.打开刚才生成的项目的属性,选择链接器->输入->附加依赖项,输入生成的Bullet库,如图


将PhysicsWorld3D类复制到classes/physics3d并添加到工程中,编译运行,成功表明配置成功,

有可能会出现error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”

将Bullet生成时的c/c++->代码生成->运行库,改为MD

5.测试PhysicsWorld3D

在HelloWorldScene.h添加

#include "physics3d/PhysicsWorld3D.h"
public:
	void onExit();
	void update(float delta);

private:
	bool initPhysics3D();	// 初始化物理世界
	bool initCamera();	// 初始化摄像机

private:
	PhysicsWorld3D* _world;	 // 3d 物理世界
	btRigidBody* _box;	// 盒子
	cocos2d::Sprite3D* _spBox;	// 盒子模型
	cocos2d::Camera* _camera;	// 摄像机

在HelloWorld::init()

先初始化摄像机,再初始化物理世界,

关于初始化物理世界,首先创建,然后添加一个地面,再添加一个box作为测试用

bool HelloWorld::initPhysics3D()
{
	_world = PhysicsWorld3D::create();	// 创建3d物理世界
	if (_world == nullptr)
	{
	return false;
	}
	
	// 载入plane模型
	auto spPlane = Sprite3D::create("model/ground.c3b"); 
	this->addChild(spPlane);
	spPlane->setPosition3D(Vec3::ZERO);
	
	// add a plane 方向向上,位置(0,0,0), 0.5的摩擦,0.5的弹性
	_world->addPlane(btVector3(0, 1, 0), btVector3(0, 0, 0), PhysicsMaterial3D(0, 0.5, 0.5, 0));
	
	// 载入盒子模型
	_spBox = Sprite3D::create("model/box.c3b");
	this->addChild(_spBox);
	_spBox->setPosition3D(Vec3(0, 20, 0));

	// add a box
	_box = _world->addBox(btVector3(1, 1, 1), btVector3(0, 20, 0));
	_box->setUserPointer(_spBox);

	// 设置2摄像机可见
	this->setCameraMask(2);
	return true;
}

每一帧去更新物理世界,同时更新box的位置,当然可以使用MotionState去优化,这个不着急

void HelloWorld::update(float delta)
{
	static float m[16];
	_world->update(delta);
	auto trans = _box->getWorldTransform();	// 获取box的变换矩阵
	trans.getOpenGLMatrix(m);
	_spBox->setNodeToParentTransform(Mat4(m));	// 设置box模型的变换矩阵,但是getPosition3D不会得到正确位置,这个以后讨论
}

当HelloWorld退出时要销毁物理世界

void HelloWorld::onExit()
{
	Layer::onExit();

	_world->destroy();	// 销毁物理世界
	_world = nullptr;
}

当运行程序,会看到一个box从天而降,重重的摔在地上


源代码及其资源下载

下载本文
显示全文
专题