角加速度在基础物理模型中的应用

我试图用一个基本的物理系统来创建一个街机飞行模型。 到目前为止,我已经设法使飞机前进,施加重力等。但是,在试图实现扭矩之后,我注意到在飞行模型中有一些有趣的行为。 当转过一会儿时,控制器显示为反转,有时,不同运动(俯仰,滚转,偏航)的控制器似乎也改变了。 我希望有人能够告诉我接下来要检查什么。 我已经包含了我的源代码,以防有人发现任何明显的错误! 我列出了一些下面的variables来显示它们的数据types:

Quaternion rotation = Quaternion.Identity; Quaternion newRotation = Quaternion.Identity; Vector3 rotationChange = Vector3.Zero; Vector3 rotVec = Vector3.Zero; 

以下是旋转力的更新逻辑:

 dt = (float)gameTime.ElapsedGameTime.TotalSeconds; if (dt > 1.0f / 60.0f) { dt = 1.0f / 60.0f; } Vector3 newRotationChange = rotationChange + dt * angularAcceleration; Vector3 newRotVec = rotVec + dt * newRotationChange; rotationChange = newRotationChange; rotVec = newRotVec; Vector3 rotAxis = rotVec; rotAxis.Normalize(); if (rotVec.Length() < 0.001f) { rotVec = Vector3.Zero; newRotation = Quaternion.CreateFromAxisAngle(forwardVector, 0.0f); } else { float angle = rotVec.Length(); newRotation = Quaternion.CreateFromAxisAngle(rotAxis, angle); } if (rotationChange.Length() < 0.001f) { rotationChange = Vector3.Zero; } rotation = newRotation; angularAcceleration = Vector3.Zero; 

我的创建扭矩的方法:

 /// <summary> /// Creates a rotational force for an object /// </summary> /// <param name="pointOfAction">Point the force is being applied on the object /// </param> /// <param name="forceAmount">Magnitude of the force being applied</param> /// <param name="forceDir">Direction of the force being applied</param> public void CreateTorque(Vector3 pointOfAction, float forceAmount, Vector3 forceDir) { // Vector from position to pointOfAction Vector3 r = pointOfAction - position; // Create the force Vector3 force = forceDir * forceAmount; // Create the torque force torque = Vector3.Cross(r, force); angularAcceleration += torque; } 

对不起,大量的代码块,并提前感谢您可以给的任何帮助。

好吧,所以我终于设法弄清楚我做错了什么。 问题是我如何将旋转向量应用于四元数。 基本上,而不是使用Quaternion.CreateFromAxisAngle()我现在创建一个旋转变化四元数使用我的角速度作为X,Y,Z组件和零标量。 所以为了清楚起见,我的新的更新代码为旋转物理。 (在计算dt之后,这代替了每一行代码)

 Vector3 newAngularVelocity = angularVelocity + dt * angularAcceleration; Quaternion rotChange = new Quaternion(angularVelocity.X, angularVelocity.Y, angularVelocity.z, 0); rotChange = Quaternion.Multiply(rotChange, dampeningFactor) * rotation; rotation += rotChange * dt; rotation.Normalize(); angularVelocity = newAngularVelocity; angularAcceleration = Vector3.Zero; 

希望这certificate对别人有帮助!

无论何时使用.CreateFromAxisAngle() ,都需要axis参数提供一个单位长度的向量。 如果你不这样做,它将会在结果中旋转,因为轴的大小是旋转计算的一个因素。

尝试像这样正常化:

 else { float angle = rotVec.Length(); rotVec /= angle;//this normalizes rotVec newRotation = Quaternion.CreateFromAxisAngle(rotVec, angle);// use 'rotVec' as the axis, not rotAxis }