我目前正在为我正在使用 C++ 和Ogre3D编写的 3D 太空游戏评估Bullet 物理库。通过从 btMotionState 派生并插入我的 SceneNodes,我已经很好地集成了 Ogre3D 和 Bullet,但是现在我在计算应该传递给 btRigidBody::applyCentralImpulse 和 btRigidBody::applyTorqueImpulse 方法以实现的值时遇到了很多麻烦我正在寻找的结果。
当我按下键盘上的 LEFT 或 RIGHT 键时,我希望飞船在本地 Z 轴上滚动。当我按下 UP 或 DOWN 时,我希望它在本地 X 轴上倾斜。当我按下 A 或 Z 时,我希望它在局部 Z 轴的方向上加速/减速。我可以使用一些四元数数学在 Ogre 中完美地实现这一点,并直接在 SceneNode 上应用平移/旋转,但我真的想使用力/扭矩方法在子弹引擎中应用这些值,以便它继续移动/俯仰/滚动即使在用户停止按键之后,摩擦力也会作用在对象上,使其在必要时减慢速度。
那么,我如何计算提供给这两种脉冲方法的必要值,以确保脉冲根据身体当前的方向而不是使用世界轴进行作用?
谢谢,马克
更新:
我能够计算出向前和向后运动所需的脉冲,但我仍在努力调整偏航/俯仰/滚动值的方向,以便将它们与扭矩脉冲法一起使用。这是我进行向前/向后运动的方式:
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);