bullet 物理引擎的角色控制器(character controller) ()

转载 :http://hi.baidu.com/ae8506/item/693a7975d4fd502ed6a89c56

作者:CYM  http://hi.baidu.com/ae8506/


角色控制器(character controller)是物理引擎必不可少的一部分

在bullet中可以通过btKinematicCharacterController和btPairCachingGhostObject来实现角色控制

其中btKinematicCharacterController类是致力于解决角色控制的类,他实现了滑动,爬梯子,跳跃等常见的动作.

在使用角色控制器之前先要包含以下几个文件

#include <BulletDynamics\Character\btKinematicCharacterController.h>
#include <BulletCollision\CollisionDispatch\btGhostObject.h>


在头文件中声明以下两个对象

btKinematicCharacterController* m_character;
btPairCachingGhostObject* m_ghostObject;

m_character就死角色控制器,m_ghostObject则是一个幽灵对象.

创建角色控制器(假设已经创建了物理世界并且可以通过physics对象调用)

//创建胶囊对象以及角色控制器
{
m_trans.setIdentity ();
m_trans.setOrigin (btVector3(0.0, 500.0, 0.0));
 
m_ghostObject = new btPairCachingGhostObject();
m_ghostObject->setWorldTransform(m_trans);
physics->m_overlappingPairCache->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
btScalar characterHeight=2.0f;
btScalar characterWidth =2.0f;
btConvexShape* capsule = new btCapsuleShape(characterWidth,characterHeight);
m_ghostObject->setCollisionShape (capsule);
m_ghostObject->setCollisionFlags (btCollisionObject::CF_CHARACTER_OBJECT);
 
btScalar stepHeight = btScalar(0.35);
m_character = new btKinematicCharacterController (m_ghostObject,capsule,stepHeight);
 
//向世界中添加碰撞对象
physics->m_dynamicsWorld->addCollisionObject(
m_ghostObject,
btBroadphaseProxy::CharacterFilter, 
btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);
physics->m_dynamicsWorld->addAction(m_character);
}


根据用户输入,更新角色


//根据外部输入,更新角色
if (m_physics->m_dynamicsWorld)
{
///设置行走方向
btTransform xform;
xform = m_ghostObject->getWorldTransform ();
//获取本地坐标向量,并且单位化
btVector3 forwardDir = xform.getBasis()[2];
btVector3 upDir = xform.getBasis()[1];
btVector3 strafeDir = xform.getBasis()[0];
forwardDir.normalize ();
upDir.normalize ();
strafeDir.normalize ();
 
btVector3 walkDirection = btVector3(0.0, 0.0, 0.0);
btScalar walkVelocity = btScalar(1.1) * 4.0; // 4 km/h -> 1.1 m/s
btScalar walkSpeed = walkVelocity* deltaTime*2.0f;

//控制前后行走,以及旋转方向,
if (m_render->m_keyboard->isKeyDown(OIS::KC_RIGHT))
{
float yaw=0.05f;
btMatrix3x3 orn = m_ghostObject->getWorldTransform().getBasis();
orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),yaw));
m_ghostObject->getWorldTransform ().setBasis(orn);
}
 
if (m_render->m_keyboard->isKeyDown(OIS::KC_LEFT))
{
float yaw=-0.05f;
btMatrix3x3 orn = m_ghostObject->getWorldTransform().getBasis();
orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),yaw));
m_ghostObject->getWorldTransform ().setBasis(orn);
}
 
if (m_render->m_keyboard->isKeyDown(OIS::KC_UP))
{
walkDirection += forwardDir;
}
 
if (m_render->m_keyboard->isKeyDown(OIS::KC_DOWN))
{
walkDirection -= forwardDir;
}
 
if(m_render->m_keyboard->isKeyDown(OIS::KC_SPACE) && m_character && m_character->canJump())
{
m_character->jump();
}
 
//按照方向移动角色
m_character->setWalkDirection(walkDirection*walkSpeed);
}
 
//更新渲染对象
m_trans=m_ghostObject->getWorldTransform();
m_node->setPosition(m_trans.getOrigin().getX(),m_trans.getOrigin().getY(),m_trans.getOrigin().getZ());
m_node->setOrientation(m_trans.getRotation().getW(),m_trans.getRotation().getX(),m_trans.getRotation().getY(),m_trans.getRotation().getZ());



优酷视频

http://v.youku.com/v_show/id_XMzc4NTgyODky.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值