bullet 物理引擎的角色控制器(character controller)
来源:互联网 发布:弹弓专卖店淘宝网 编辑:程序博客网 时间:2024/05/01 16:17
转载 :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>
#include <BulletDynamics\Character\btKinematicCharacterController.h>#include <BulletCollision\CollisionDispatch\btGhostObject.h>
在头文件中声明以下两个对象
- btKinematicCharacterController* m_character;
- btPairCachingGhostObject* m_ghostObject;
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);
- }
//创建胶囊对象以及角色控制器{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());
//根据外部输入,更新角色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/sbtScalar 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
- bullet 物理引擎的角色控制器(character controller) ()
- bullet 物理引擎的角色控制器(character controller)
- character controller角色控制器
- 角色控制器 Character Controller
- 角色控制器 Character Controller
- 角色控制器 Character Controller
- Unity3d角色控制器Character Controller
- Unity3D 角色控制器(Character Controller)Move、SimpleMove的区别
- bullet物理引擎btBvhTriangleMeshShape,btHeightfieldTerrainShape的使用
- Bullet 物理引擎 简析
- bullet物理引擎-配置
- Bullet 物理引擎 简析[1]
- Bullet 物理引擎 简析[1]
- Bullet物理引擎及基础知识
- Bullet物理引擎教程: helloworld
- bullet物理引擎创建流程
- 【截图整理官方教程】unity 2D角色控制器 2D Character Controller
- Bullet 3D 物理引擎 简析(2)
- bzoj 1415 聪聪和可可(概率DP)
- IOS各类错误汇总
- 图解数据结构(1)——大圈表示法、动态数组和单向链表
- 类的设计技巧
- java中的static详解
- bullet 物理引擎的角色控制器(character controller)
- hdu(3007)
- The Boost C++ Libraries
- java初始化顺序
- Bullet引擎碰撞事件中回调函数用法详解
- 继续写blog
- 清空(數據庫中所有)表數據
- HTML中的<UL>标签中li横向排列
- cocos2d-x ccArray 讲解