首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >四元数正确旋转

四元数正确旋转
EN

Stack Overflow用户
提问于 2013-10-04 00:17:06
回答 1查看 5.5K关注 0票数 2

我对旋转大理石有一些问题。

我已经在Matrix.CreateFromYawPitchRollMatrix.CreateRotation上试过了,但是有一些问题,我认为是因为Gimbal锁定效应。

因此,我尝试使用四元数代替,但是没有什么改变。

当只在一个轴上运动时,它工作得很好,但是当旋转发生在两个不同的轴上时,大理石仍然在错误的轴上旋转。

这是我的密码:

代码语言:javascript
复制
// declarations
Vector3 Position = Vector3.Zero;
Vector3 Rotation = Vector3.Zero;
Quaternion qRotation = Quaternion.Identity;

AbsoluteBoneTransforms = new Matrix[Model.Bones.Count]; 
Model.CopyAbsoluteBoneTransformsTo(AbsoluteBoneTransforms); 

Update方法中:

代码语言:javascript
复制
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方法中:

代码语言:javascript
复制
effect.World = AbsoluteBoneTransforms[mesh.ParentBone.Index] * 
  Matrix.CreateFromQuaternion(qRotation) * Matrix.CreateTranslation(Position);

怎么了?在多轴上使用Quaternion.CreateFromAxisAngle是错误的吗?

编辑

我尝试直接计算我的大理石的旋转轴,而不是使用多轴的组合:

代码语言:javascript
复制
angle += speed.Length() * angularVelocity;
qRotation = Quaternion.CreateFromAxisAngle(Vector3.Cross(speed, Vector3.Up), angle);
qRotation.Normalize();

angle是一个跟踪当前运动的浮点数。

这个解决方案似乎没有创造万向节锁,但大理石旋转是不正确的,似乎转速不是恒定的,但随着时间的推移变得越来越快,我不明白为什么。

如果我将四元数“连在一起”,我就会使用

代码语言:javascript
复制
qRotation *= Quaternion.CreateFromAxisAngle(Vector3.Cross(speed, Vector3.Up), angle)

Gimbal锁定效果仍然可见。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-04 11:54:54

我就是这样处理的:

我假设speed是一个向量,表示球滚动的方向,它的大小代表它沿着这个方向移动的速度。

代码语言:javascript
复制
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,矩阵从左到右,四元数从右到左。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19171183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档