我对旋转大理石有一些问题。
我已经在Matrix.CreateFromYawPitchRoll和Matrix.CreateRotation上试过了,但是有一些问题,我认为是因为Gimbal锁定效应。
因此,我尝试使用四元数代替,但是没有什么改变。
当只在一个轴上运动时,它工作得很好,但是当旋转发生在两个不同的轴上时,大理石仍然在错误的轴上旋转。
这是我的密码:
// 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是一个跟踪当前运动的浮点数。
这个解决方案似乎没有创造万向节锁,但大理石旋转是不正确的,似乎转速不是恒定的,但随着时间的推移变得越来越快,我不明白为什么。
如果我将四元数“连在一起”,我就会使用
qRotation *= Quaternion.CreateFromAxisAngle(Vector3.Cross(speed, Vector3.Up), angle)Gimbal锁定效果仍然可见。
发布于 2013-10-04 11:54:54
我就是这样处理的:
我假设speed是一个向量,表示球滚动的方向,它的大小代表它沿着这个方向移动的速度。
Vector3 axis = Vector3.Cross(speed, Vector3.Up);
float angle = speed.Length();//factor by delta time if neccesary
Quaternion rotationThisFrame = Quaternion.CreateFromAxisAngle(axis, angle * (1/radiusOfBall));然后您可以将其连接到您的qRotation。此外,您可能需要正常化您的四元数后,级联。
更新:这个问题/线程的正确答案是颠倒了四元数连接的顺序。关于XNA,矩阵从左到右,四元数从右到左。
https://stackoverflow.com/questions/19171183
复制相似问题