I have some problems with a rotating marble.
I've tried it with
Matrix.CreateRotation but there were some problems, I think it's due to the Gimbal lock effect.
So, I've tried using quaternions instead, but nothing changed.
When moving on only an axis it works fine, but when the rotation occurs on two different axes the marble still rotates on wrong axes.
Here's my code:
// declarations Vector3 Position = Vector3.Zero; Vector3 Rotation = Vector3.Zero; Quaternion qRotation = Quaternion.Identity; AbsoluteBoneTransforms = new Matrix[Model.Bones.Count]; Model.CopyAbsoluteBoneTransformsTo(AbsoluteBoneTransforms);
Position += speed; Rotation = speed * MathHelper.ToRadians(-1.5f); Quaternion rot = Quaternion.CreateFromAxisAngle(Vector3.Right, Rotation.Z) * Quaternion.CreateFromAxisAngle(Vector3.Backward, Rotation.X); qRotation *= rot;
And in the
effect.World = AbsoluteBoneTransforms[mesh.ParentBone.Index] * Matrix.CreateFromQuaternion(qRotation) * Matrix.CreateTranslation(Position);
I've tried calculating directly the axis of rotation of my marble, instead of using combination of multiple axes:
angle += speed.Length() * angularVelocity; qRotation = Quaternion.CreateFromAxisAngle(Vector3.Cross(speed, Vector3.Up), angle); qRotation.Normalize();
angle is a float that keeps track of the current movement.
This solution doesn't seem to create Gimbal lock, but marble rotations aren't correct, it seems that the rotating speed is not constant, but became faster and slower over time, I can't understand why.