我有一些旋转大理石的问题。
我试过了Matrix.CreateFromYawPitchRoll
,Matrix.CreateRotation
但有一些问题,我认为这是由于万向节锁定效应。
所以,我尝试使用四元数,但没有任何改变。
当仅在一个轴上移动时,它工作正常,但当旋转发生在两个不同的轴上时,大理石仍然在错误的轴上旋转。
这是我的代码:
// declarations
Vector3 Position = Vector3.Zero;
Vector3 Rotation = Vector3.Zero;
Quaternion qRotation = Quaternion.Identity;
AbsoluteBoneTransforms = new Matrix[Model.Bones.Count];
Model.CopyAbsoluteBoneTransformsTo(AbsoluteBoneTransforms);
在Update
方法中:
Position += speed;
Rotation = speed * MathHelper.ToRadians(-1.5f);
Quaternion rot = Quaternion.CreateFromAxisAngle(Vector3.Right, Rotation.Z) *
Quaternion.CreateFromAxisAngle(Vector3.Backward, Rotation.X);
qRotation *= rot;
在Draw
方法中:
effect.World = AbsoluteBoneTransforms[mesh.ParentBone.Index] *
Matrix.CreateFromQuaternion(qRotation) * Matrix.CreateTranslation(Position);
怎么了?Quaternion.CreateFromAxisAngle
在多个轴上使用是错误的吗?
编辑
我尝试直接计算我的大理石的旋转轴,而不是使用多个轴的组合:
angle += speed.Length() * angularVelocity;
qRotation = Quaternion.CreateFromAxisAngle(Vector3.Cross(speed, Vector3.Up), angle);
qRotation.Normalize();
angle
是一个跟踪当前运动的浮点数。
此解决方案似乎没有创建Gimbal lock,但大理石旋转不正确,似乎旋转速度不是恒定的,而是随着时间的推移变得越来越快,我不明白为什么。
如果我“连接”四元数,我会使用每一帧
qRotation *= Quaternion.CreateFromAxisAngle(Vector3.Cross(speed, Vector3.Up), angle)
云台锁定效果依然可见。