opengl矩阵旋转四元数

时间:2010-07-28 02:58:15

标签: opengl matrix rotation quaternions

我试图围绕x轴和y轴简单地旋转立方体:

我希望始终在x轴上旋转数量x 并将y轴上的立方体旋转y值,与x轴旋转无关

首先我天真地做了:

glRotatef(x,1,0,0);
glRotatef(y,0,1,0);

然后

但首先在x上旋转然后在y上旋转 我想独立于x访问旋转y。

我开始研究四元数,所以我尝试了:

Quaternion Rotation1;
Rotation1.createFromAxisAngle(0,1, 0, globalRotateY);
Rotation1.normalize();

Quaternion Rotation2;
Rotation2.createFromAxisAngle(1,0, 0, globalRotateX);
Rotation2.normalize();

GLfloat Matrix[16];

Quaternion q=Rotation2 * Rotation1;

q.createMatrix(Matrix);
glMultMatrixf(Matrix);

这几乎完全是做了2连续glRotates所完成的...所以我想我错过了一步或2。

是四元数的方式,还是我应该使用不同的东西?如果四元数是我可以添加的步骤,以使立方体独立于每个轴旋转。 我认为其他人有同样的问题: Rotating OpenGL scene in 2 axes

4 个答案:

答案 0 :(得分:3)

我使用四元数正确地工作:我确定还有其他方法,但是进行了一些重新调整,这对我来说非常合适。我在另一个论坛上发布了类似的版本。 http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=280859&#Post280859

首先创建x / y变化角度的四元数表示 然后每个帧将变化的角度四元数乘以累积的四元数,然后最终将该四元数转换为矩阵形式以乘以当前矩阵。这是循环的主要代码:

Quaternion3D Rotation1=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(-1.0f,0,0), DEGREES_TO_RADIANS(globalRotateX));
Quaternion3DNormalize(&Rotation1);

Quaternion3D Rotation2=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(0.0f,-1.0f,0), DEGREES_TO_RADIANS(globalRotateY));
Quaternion3DNormalize(&Rotation2);


Matrix3D Mat;
Matrix3DSetIdentity(Mat);
Quaternion3DMultiply(&QAccum, &Rotation1);

Quaternion3DMultiply(&QAccum, &Rotation2);

Matrix3DSetUsingQuaternion3D(Mat, QAccum);
globalRotateX=0;
globalRotateY=0;

glMultMatrixf(Mat);

然后绘制立方体

答案 1 :(得分:0)

如果你能够更详细地解释你想要做什么以及你得到的结果与你想要的结果有什么不同,那将会有很大的帮助。但通常使用欧拉角进行旋转会产生一些问题,因为组合旋转会导致不直观的行为(在最坏的情况下会失去一定的自由度。)

如果你能找到一个代表你想要的旋转的单个轴和一个角度,那么Quaternion slerp可能就是你的选择。但是使用四元数在X和Y轴周围进行连续旋转不会帮助您避免组成Euler旋转时固有的问题。

您链接的帖子似乎涉及另一个问题。这张海报似乎是在翻译他的物体然后进行旋转,当他应该首先旋转然后进行翻译时。

答案 2 :(得分:0)

目前尚不清楚您想要实现的目标。也许您应该考虑一些点以及您希望它们旋转到的位置 - 例如顶点(1,1,1)应映射到(0,1,0)。然后,根据该信息,您可以计算所需的旋转。

四元数通常用于在两个旋转“位置”之间进行插值。因此,第一步是确定您尚未拥有的开始和结束“位置”。完成后,使用四元数进行插值。这听起来不像你有任何时间变化的方面。

答案 3 :(得分:0)

你的问题不是万向节锁定。实际上,没有理由为什么你的四元数版本比矩阵(glRotate)版本更好,因为你使用的四元数在数学上与你的旋转矩阵相同。

如果您想要的是鼠标控件,您可能需要查看arcballs