7

我试图做一个立方体绕 x 和 y 轴的简单旋转:

我想始终将立方体在 x 轴上旋转 x 量,并将立方体在 y 轴上旋转 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 步。

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

4

4 回答 4

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);

然后画立方体

于 2010-07-29T05:50:53.053 回答
0

如果您可以更详细地解释您正在尝试做什么以及您获得的结果与您想要的结果有何不同,那将会很有帮助。但总的来说,使用欧拉角进行旋转有一些问题,因为组合旋转会导致不直观的行为(并且在最坏的情况下会失去一定的自由度。)

如果您可以找到代表您想要的旋转的单个轴和单个角度,那么四元数 slerp 可能是适合您的方法。但是使用四元数围绕 X 和 Y 轴进行连续旋转并不能帮助您避免组合欧拉旋转中固有的问题。

不过,您链接到的帖子似乎涉及另一个问题。海报似乎一直在平移他的对象,然后进行旋转,而他本应该先旋转然后平移。

于 2010-07-28T03:26:31.300 回答
0

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

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

于 2010-07-28T04:07:34.377 回答
0

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

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

于 2010-07-28T17:21:25.377 回答