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的头文件复制到cocosframeworkscocos2d-xexternalBullet;具体方法请看 如下图Bullet3之交叉编译Android复制头文件
4.将编译好的Bullet库(win32)release库复制到 Cocosframeworkscocos2d-xprebuiltwin32下分别更名为 BulletCollision_vs2012.lib BulletDynamics_vs2012.lib BulletSoftBody_vs2012.lib LinearMath_vs2012.lib 如何得到Bullet库,这个就要去看Bullet3之HelloWorld(vs2012)补充如何生成Bullet库 5.打开刚才生成的项目的属性,选择链接器->输入->附加依赖项,输入生成的Bullet库,如图
将PhysicsWorld3D类复制到classes/physics3d并添加到工程中,编译运行,成功表明配置成功, 有可能会出现errorLNK2038:检测到“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.5的摩擦,0.5的弹性 _world->addPlane(btVector3(0,1,btVector3(0,PhysicsMaterial3D(0,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),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从天而降,重重的摔在地上
源代码及其资源下载 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |