yea*_*xon 7 opengl rotation matrix quaternions
我试图围绕x轴和y轴进行简单的旋转:
我想总是在x轴上旋转一个数量x的立方体,并在y轴上旋转立方体y,与x轴旋转无关
首先,我天真地做了:
glRotatef(x,1,0,0);
glRotatef(y,0,1,0);
Run Code Online (Sandbox Code Playgroud)
然后
但是首先在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);
Run Code Online (Sandbox Code Playgroud)
这几乎完全是做完2连续glRotates所做的...所以我想我错过了一步或2.
是四元数的方式或我应该使用不同的东西?如果四元数是我可以添加的步骤,以使立方体独立于每个轴旋转.我认为其他人也有同样的问题: 在2轴上旋转OpenGL场景
我使用四元数使其正常工作:我确信还有其他方法,但经过一些研究后,这对我来说非常有效。我在另一个论坛上发布了类似的版本。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);
Run Code Online (Sandbox Code Playgroud)
然后画立方体