我目前正在评估我用C++编写的3D空间游戏Bullet Physics Library和Ogre3D。我已经通过派生自btMotionState并插入SceneNodes来很好地集成了Ogre3D和Bullet,但是现在我在计算应该传递给btRigidBody :: applyCentralImpulse和btRigidBody :: applyTorqueImpulse方法的值时遇到了很多麻烦,以便实现我正在寻找的结果。Bullet Physics - 在人体局部空间中应用转矩脉冲
当我按下键盘上的LEFT或RIGHT键时,我想宇宙飞船在本地Z轴上滚动。当我按UP或DOWN时,我想让它在当地的X轴上投球。当我按A或Z时,我希望它在本地Z轴的方向上加速/减速。我可以在Ogre中使用一些四元数学并在SceneNode上直接应用平移/旋转来完美实现这一点,但我真的希望使用力/力矩方法在Bullet引擎中应用这些值,以便它继续移动/俯仰/滚动即使在用户停止按下按键之后,摩擦也会在物体上起作用,以便在必要时减慢它。
那么,如何计算提供给这两种冲动方法的必要值,以确保脉冲基于身体的当前方向而不是使用世界坐标轴?
感谢, 马克
更新:
我能计算出所需的向前和向后运动的冲动,但我仍然是如何重新定位偏航/俯仰/滚动值挣扎以便用扭矩冲击法来使用它们。以下是我做的向前/向后移动:
if (mKeyboard->isKeyDown(OIS::KC_A))
mBody->applyCentralImpulse(mBody->getWorldTransform().getBasis().getColumn(2) * 20 * time);
if (mKeyboard->isKeyDown(OIS::KC_Z))
mBody->applyCentralImpulse(mBody->getWorldTransform().getBasis().getColumn(2) * -20 * time);
你可以通过四元数的冲动API或以某种方式四元数转换的东西,你可以通过? – fbrereto 2009-11-04 22:24:04
从我可以在API中看到的,它出现在线性脉冲法仅在世界坐标接受一个x,y,z中的方向的矢量,和角脉冲法只接受一个Y,P,R矢量偏航,俯仰和滚动世界坐标。虽然数学可以在我的头上略(我有一个很难形象化的东西像点和跨产品),实际子弹API本身是远远超过我的头,完全新的给我...这两者的结合使我的现在的生活是不可能的。 – Lusid 2009-11-05 00:06:11