Bullet(Cocos2dx)之使用cocos2dx测试PhysicsWorld3D

前端之家收集整理的这篇文章主要介绍了Bullet(Cocos2dx)之使用cocos2dx测试PhysicsWorld3D前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.使用Cocos引擎建立工程,打开cocosstudio修改分辨率为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库(win32release库复制到

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

BulletCollision_vs2012.lib

BulletDynamics_vs2012.lib

BulletSoftBody_vs2012.lib

LinearMath_vs2012.lib

如何得到Bullet库,这个就要去看Bullet3HelloWorldvs2012补充如何生成Bullet

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


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

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

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

5.测试PhysicsWorld3D

HelloWorldScene.h添加

  1. #include"physics3d/PhysicsWorld3D.h"
  2. public:
  3. voidonExit();
  4. voidupdate(floatdelta);
  5. private:
  6. boolinitPhysics3D();//初始化物理世界
  7. boolinitCamera();//初始化摄像机
  8. private:
  9. PhysicsWorld3D*_world;//3d物理世界
  10. btRigidBody*_Box;//盒子
  11. cocos2d::Sprite3D*_spBox;//盒子模型
  12. cocos2d::Camera*_camera;//摄像机

在HelloWorld::init()

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

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

  1. boolHelloWorld::initPhysics3D()
  2. {
  3. _world=PhysicsWorld3D::create();//创建3d物理世界
  4. if(_world==nullptr)
  5. {
  6. returnfalse;
  7. }
  8. //载入plane模型
  9. autospPlane=Sprite3D::create("model/ground.c3b");
  10. this->addChild(spPlane);
  11. spPlane->setPosition3D(Vec3::ZERO);
  12. //addaplane方向向上,位置(0,0),0.5的摩擦,0.5的弹性
  13. _world->addPlane(btVector3(0,1,btVector3(0,PhysicsMaterial3D(0,0.5,0));
  14. //载入盒子模型
  15. _spBox=Sprite3D::create("model/Box.c3b");
  16. this->addChild(_spBox);
  17. _spBox->setPosition3D(Vec3(0,20,0));
  18. //addaBox
  19. _Box=_world->addBox(btVector3(1,1),0));
  20. _Box->setUserPointer(_spBox);
  21. //设置2摄像机可见
  22. this->setCameraMask(2);
  23. returntrue;
  24. }

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

  1. voidHelloWorld::update(floatdelta)
  2. {
  3. staticfloatm[16];
  4. _world->update(delta);
  5. autotrans=_Box->getWorldTransform();//获取Box的变换矩阵
  6. trans.getOpenGLMatrix(m);
  7. _spBox->setNodeToParentTransform(Mat4(m));//设置Box模型的变换矩阵,但是getPosition3D不会得到正确位置,这个以后讨论
  8. }

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

  1. voidHelloWorld::onExit()
  2. {
  3. Layer::onExit();
  4. _world->destroy();//销毁物理世界
  5. _world=nullptr;
  6. }

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


源代码及其资源下载

猜你在找的Cocos2d-x相关文章