gpt4 book ai didi

c++ - Bullet Physics - 在 body 的局部空间中应用扭矩脉冲

转载 作者:IT老高 更新时间:2023-10-28 22:05:35 24 4
gpt4 key购买 nike

我目前正在评估 Bullet Physics Library对于我正在使用 C++ 和 Ogre3D 编写的 3D 太空游戏.通过从 btMotionState 派生并插入我的 SceneNodes,我已经很好地集成了 Ogre3D 和 Bullet,但是现在我在计算应该传递给 btRigidBody::applyCentralImpulse 和 btRigidBody::applyTorqueImpulse 方法以实现的值时遇到了很多麻烦我正在寻找的结果。

当我按下键盘上的 LEFT 或 RIGHT 键时,我希望飞船在本地 Z 轴上滚动。当我按下 UP 或 DOWN 时,我希望它在本地 X 轴上倾斜。当我按下 A 或 Z 时,我希望它在局部 Z 轴的方向上加速/减速。我可以使用一些四元数数学在 Ogre 中完美地实现这一点,并直接在 SceneNode 上应用平移/旋转,但我真的想使用力/扭矩方法在子弹引擎中应用这些值,以便它继续移动/俯仰/滚动即使在用户停止按键之后,摩擦也会作用在对象上,从而在必要时减慢它的速度。

那么,我如何计算提供给这两种脉冲方法的必要值,以确保脉冲根据 body 当前的方向而不是使用世界坐标轴起作用?

谢谢,马克

更新:

我能够计算出向前和向后运动所需的脉冲,但我仍在努力调整偏航/俯仰/滚动值的方向,以便将它们与扭矩脉冲法一起使用。以下是我进行向前/向后移动的方式:

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);

最佳答案

所以看看 btRigidBody.h

我注意到以下代码:

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

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

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

  1. 旋转以对齐轴预制件
  2. 围绕规范轴旋转
  3. 与第 1 步相反

这意味着,如果您可以识别轴对齐扭矩(我不知道在我的头顶上),您可以使用您的:

mBody->getWorldTransform()*axisAlignedXTorque

根据 http://www.bulletphysics.com/Bullet/BulletFull/classbtTransform.html此处的 * 运算符被覆盖以对 Torque vector 进行世界变换。

关于c++ - Bullet Physics - 在 body 的局部空间中应用扭矩脉冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com