opengl矩阵旋转四元数
我试图做一个关于x和y轴的立方体的简单旋转:
我希望总是将x轴上的立方体旋转x的量,然后将x轴上的立方体旋转y轴,与x轴的旋转无关
首先我天真地做到了:
glRotatef(x,1,0,0);
glRotatef(y,0,1,0);
然后
但是首先绕x旋转,然后旋转yi想独立于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。
是四元的路要走还是应该使用不同的东西? 如果四元数是我可以添加的步骤,以使多维数据集独立于每个轴旋转。 我认为别人有同样的问题:旋转2轴的OpenGL场景
我得到这个使用四元数正确工作:我确定还有其他方法,但反过来一些reseatch,这完全适合我。 我在另一个论坛上发布了类似的版本。 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);
然后绘制立方体
如果你能够更详细地解释你正在做什么以及你得到的结果与你想要的结果有什么不同,这将会有很大的帮助。 但是一般来说,使用欧拉角来旋转会产生一些问题,因为结合旋转会导致不直观的行为(并且在最坏的情况下会失去一定的自由度)。
如果你能找到代表你想要的旋转的单个轴和单个角度,Quaternion slerp可能是你的选择。 但是用四元数围绕X轴和Y轴连续旋转将无助于避免构成欧拉旋转时固有的问题。
但是,您链接的帖子似乎涉及到另一个问题。 这张海报似乎一直在翻译他的对象,然后做他的旋转,当他应该先旋转,然后翻译。
目前还不清楚你想达到什么目的。 也许你应该考虑一些点和你想让它们旋转到哪里 - 例如顶点(1,1,1)应该映射到(0,1,0)。 然后,根据该信息,您可以计算所需的旋转。
四元数通常用于在两个旋转“位置”之间进行插值。 所以第一步是确定你的开始和结束“职位”,你还没有。 一旦你有了,你使用四元数进行插值。 这听起来不像你在这里有任何时间变化的方面。
链接地址: http://www.djcxy.com/p/2305.html