19

我目前正在为我正在使用 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);
4

2 回答 2

3

所以看看 btRigidBody.h

我注意到以下代码:

     void applyTorqueImpulse(const btVector3& torque)
     {
                     m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor;
     }

现在据我了解,您希望您的扭矩等于某个常数乘以围绕与您的宇宙飞船相关的 x(或 z)轴的旋转矢量。

众所周知,广义旋转矩阵可以确定如下:

  1. 旋转以对齐轴预制件
  2. 围绕标准轴旋转
  3. 步骤 1 的逆操作

这意味着,如果您可以识别轴对齐扭矩(我不知道),您可以使用以下方法对其进行转换:

mBody->getWorldTransform()*axisAlignedXTorque

根据http://www.bulletphysics.com/Bullet/BulletFull/classbtTransform.html ,这里的 * 运算符被覆盖以在 Torque 向量上执行世界变换。

于 2009-11-05T21:27:31.503 回答
1
body->getInvInertiaTensorWorld().inverse()*(body->getWorldTransform().getBasis()*torque)

经过长时间的挫折后,我终于得到了身体局部扭矩,使用上述作为 applyTorqueImpulse(或 applyTorque)的输入。我不假装理解它为什么在这一点上起作用,但它确实如此。

从子弹:

    void applyTorqueImpulse(const btVector3& torque)
{
        m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor;
}

也许这就是 tzenes 提到的关于产生轴对齐扭矩的内容。但我很困惑,我找不到其他人这样做的例子。肯定有人想要在身体的局部空间中施加扭矩吗?但我在网上发现的任何东西都不起作用,尽管它看起来应该如此。

如果你只应用 transform*torque,它看起来就像它一开始就可以工作,直到你开始远离你的世界的起源。因此,如果您离原点越远,旋转感觉越困难,或者如果根据身体的位置开始反向旋转,这可能是您的问题。

编辑: 哦,这就是我的翻译方式:

btVector3 m = body->getWorldTransform().getBasis()*btVector3(strafe,move,rise);

于 2013-05-11T23:37:35.633 回答