2010-07-28 178 views
7

我试着做一个关于x和y轴的立方体的一个简单的旋转:OpenGL的矩阵旋转四元

我想总是以量X 旋转在x轴的立方体,并通过旋转立方体y轴通过量Y独立于x轴旋转

第一的i天真地做的:

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

然后

但第一旋转OV呃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

+0

OK,让我这样说...我想要做的就是用鼠标旋转的立方体。我想向左右控制屏幕y轴旋转,然后向下控制屏幕x轴旋转。我希望它们独立于另一个轴旋转,但仅在屏幕全局坐标轴上旋转。 如果我做2 glRotations我不会得到这种行为,因为一轴旋转使另一个旋转。 – yeahdixon 2010-07-28 07:03:01

+0

例如旋转立方体: 没有旋转操作只显示单面 然后我做 glRotatef(90,1,0,0); \t glRotatef(45,0,1,0); \t⁃\t gives \t给我一个倾斜的立方体(钻石),当我想要一个立方体的角落朝向相机,这实际上是交换操作的结果: \t glRotatef(45,0,1,0); \t glRotatef(90,1,0,0); 我只是交换旋转命令,但当角度值翻转时会遇到相同的问题。 – yeahdixon 2010-07-28 07:03:43

回答

3

我得到这个工作正常使用四元数:我确定有其他方式,但反过来reseset,这对我完全工作。我在另一个论坛上发布了类似的版本。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); 

然后绘制立方体

+0

这个网站真的帮了我很大的忙: http://www.gamedev.net/reference/articles/article1095.asp但一开始我没有任何意义,直到我研究并尝试了更多的东西 – yeahdixon 2010-07-29 05:53:42

0

这将有很大的帮助,如果你能给出你正在尝试做的,更详细的解释你所得到的结果是如何从你想要的结果不同。但一般情况下,使用欧拉角度旋转有一些问题,因为组合旋转会导致不直观的行为(并且在最坏的情况下会失去一定的自由度)。

如果可以的话,Quaternion slerp可能会适合您找到代表您想要的旋转的单个轴和单个角度。但是使用四元数围绕X和Y轴连续旋转将无助于避免构成欧拉旋转中固有的问题。

您链接到的帖子似乎涉及另一个问题,但。这张海报似乎一直在翻译他的对象,然后做他的旋转,当他应该先旋转,然后翻译。

+0

我更详细地描述了上述问题,但我认为官方称为万向节锁 – yeahdixon 2010-07-28 07:10:56

0

目前尚不清楚你想实现什么。也许你应该考虑一些问题以及你想让它们旋转到哪里 - 例如顶点(1,1,1)应该映射到(0,1,0)。然后,根据该信息,您可以计算所需的旋转。

四元数通常用于插入两个旋转“位置”之间。所以第一步是确定你的开始和结束“职位”,你还没有。一旦你有了,你使用四元数进行插值。这听起来不像你在这里有任何时间变化的方面。

+0

我更详细地描述了上述问题,但我认为官方称为万向节锁 – yeahdixon 2010-07-28 07:10:33

0

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

如果你想要的是鼠标控制,你可能想要检查出arcballs

+0

谢谢,是的,我完全同意,四元数和旋转矩阵可以互换,因此可以在没有四元数的情况下完成。这个概率的答案更多的是在矩阵的预乘法中,使用增量旋转。 – yeahdixon 2010-08-02 00:14:15