微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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添加

#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从天而降,重重的摔在地上


源代码及其资源下载

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐