我试着绕x和y轴做一个简单的立方体旋转:
我想始终将立方体绕x轴旋转x量,并将立方体绕yaxis旋转y量,与x轴旋转无关。
首先,我天真地做了:
glRotatef(x,1,0,0);
glRotatef(y,0,1,0);然后
但是它首先在x上旋转,然后在y上旋转,我想在y上旋转,独立于x的访问。
我开始研究四元数,所以我试着:
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 ...so所做的完全一样,我想我漏掉了一两步。
四元数是可行的吗,还是我应该使用不同的东西?如果四元数是可行的,我可以添加哪些步骤来使立方体独立于每个轴旋转。我认为其他人也有同样的问题:Rotating OpenGL scene in 2 axes
发布于 2010-07-29 13:50:53
我使用四元数让它正确地工作:我相信还有其他方法,但经过一些研究,这对我来说是完美的。我在另一个论坛上发布了一个类似的版本。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);然后绘制立方体
发布于 2010-07-28 11:26:31
如果你能更详细地解释你正在尝试做什么,以及你得到的结果与你想要的结果有何不同,这将会有很大帮助。但通常使用Euler角度进行旋转会有一些问题,因为组合旋转可能会导致不直观的行为(在最坏的情况下还会失去自由度)。
如果您能找到表示所需旋转的单个轴和单个角度,则四元数slerp可能是适合您的方法。但是,使用四元数绕X和Y轴连续旋转不会帮助您避免合成Euler旋转时固有的问题。
你链接到的帖子似乎涉及到另一个问题。发帖者似乎一直在平移他的物体,然后进行旋转,而他本应该先旋转,然后再平移。
发布于 2010-07-28 12:07:34
目前还不清楚你想要实现什么。也许你应该考虑一些点和你想要它们旋转到的位置--例如vertex (1,1,1)应该映射到(0,1,0)。然后,根据该信息,您可以计算所需的旋转。
四元数通常用于在两个旋转的“位置”之间进行插值。因此,第一步是确定你还没有的开始和结束“位置”。一旦你有了它,你就可以使用四元数来进行插值。在这里听起来你没有任何时变的方面。
https://stackoverflow.com/questions/3349575
复制相似问题