代码之家  ›  专栏  ›  技术社区  ›  Lusid

子弹物理-在身体局部空间施加扭矩脉冲

  •  18
  • Lusid  · 技术社区  · 15 年前

    我正在评估 Bullet Physics Library 对于3D空间游戏,我用C++编写 Ogre3D

    当我按下键盘上的左键或右键时,我希望飞船在局部Z轴上滚动。当我向上或向下按时,我希望它在本地X轴上倾斜。当我按A或Z时,我希望它在局部Z轴方向上加速/减速。我可以在食人魔身上用四元数数学完美地实现这一点,并直接在场景节点上应用平移/旋转,但我真的想用力/力矩方法在子弹引擎中应用这些值,这样即使用户停止按键,子弹引擎也会继续移动/俯仰/滚动,因此摩擦力会作用在物体上,在必要时减缓它的速度。

    马克

    更新:

    我能够计算出向前和向后移动所需的脉冲,但我仍在努力研究如何重新调整偏航/俯仰/侧倾值,以便将它们与扭矩脉冲法结合使用。下面是我如何向前/向后移动的:

    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);
    
    2 回复  |  直到 15 年前
        1
  •  3
  •   tzenes    15 年前

    所以看着b刚体.h

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

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

    1. 步骤1的倒数

    mBody->getWorldTransform()*axisAlignedXTorque
    

    根据 http://www.bulletphysics.com/Bullet/BulletFull/classbtTransform.html 这里的*运算符被重写以在转矩矢量上执行世界变换。

        2
  •  1
  •   Josh    11 年前
    body->getInvInertiaTensorWorld().inverse()*(body->getWorldTransform().getBasis()*torque)
    

    从项目符号:

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

    也许这就是tzenes所说的产生轴向扭矩的原因。但我很困惑,我找不到其他人这样做的例子。肯定有人想在身体的局部空间施加扭矩?但我在网上找不到任何有用的东西,尽管看起来是应该的。

    哦,下面是我的翻译:

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