I'm trying to write some code to make a body turn to face an orientation (perhaps derived from a point in world space) using forces and torque.
Can you give me some advice on how to do this?
Code: Select all
// Angular.
Vector3 vDeltaW = Vector3.Subtract(this.vAngularVelTarget, Vector3.TransformNormal(pBody.AngularVelocity, mBodyInverse));
if (Math.Abs(vDeltaW.X) + Math.Abs(vDeltaW.Y) + Math.Abs(vDeltaW.Z) > 0.001f)
{
Vector3 vLocalForceW = (vDeltaW / fTimeStep) * fMass;
//Vector3 vLocalForceW = new Vector3(
// (vDeltaW.X / fTimeStep) * (1.0f / pBody.InvInertiaDiagLocal.X),
// (vDeltaW.Y / fTimeStep) * (1.0f / pBody.InvInertiaDiagLocal.Y),
// (vDeltaW.Z / fTimeStep) * (1.0f / pBody.InvInertiaDiagLocal.Z));
Vector3 vMaxForceW = vAngularAcceleration * fMass;
//Vector3 vMaxForceW = new Vector3(
// vAngularAcceleration.X * (1.0f / pBody.InvInertiaDiagLocal.X),
// vAngularAcceleration.Y * (1.0f / pBody.InvInertiaDiagLocal.Y),
// vAngularAcceleration.Z * (1.0f / pBody.InvInertiaDiagLocal.Z));
if (vLocalForceW.X > vMaxForceW.X) vLocalForceW.X = vMaxForceW.X;
else if (vLocalForceW.X < -vMaxForceW.X) vLocalForceW.X = -vMaxForceW.X;
if (vLocalForceW.Y > vMaxForceW.Y) vLocalForceW.Y = vMaxForceW.Y;
else if (vLocalForceW.Y < -vMaxForceW.Y) vLocalForceW.Y = -vMaxForceW.Y;
if (vLocalForceW.Z > vMaxForceW.Z) vLocalForceW.Z = vMaxForceW.Z;
else if (vLocalForceW.Z < -vMaxForceW.Z) vLocalForceW.Z = -vMaxForceW.Z;
Vector3 vWorldForceW = Vector3.TransformNormal(vLocalForceW, pBody.WorldTransform);
pBody.ApplyTorque(vWorldForceW);
}
Thanks in advance, sorry if its an obvious question!
John