1.使用 Cocos 引擎建立工程,打开 cocosstudio 修改分辨率为 960*640 ,删掉背景图片 发布到vs 工程 1.打开 AppDelegate 设置分辨率,并运行 director-getOpenGLView()-setDesignResolutionSize(960,640, ResolutionPolicy :: EXACT_FIT ); 2.配置Bullet(win
1.使用 Cocos 引擎建立工程,打开 cocos studio 修改分辨率为 960*640 ,删掉背景图片
发布到vs 工程
1.打开 AppDelegate 设置分辨率,并运行
director->getOpenGLView()->setDesignResolutionSize(960, 640, 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从天而降,重重的摔在地上
源代码及其资源下载
查看更多关于Bullet(Cocos2dx)之使用cocos2dx测试PhysicsWorld3D的详细内容...