在OpenGL中,在对象自己的轴上旋转对象
Rotate an object on its own axes in OpenGL
所以我有一个立方体,我希望围绕它的三个轴中的任何一个旋转(立方体的轴,而不是窗口)。正如许多其他类似的问题所说,只要我只朝一个方向旋转,我的旋转就会起作用,但当我开始混合它们时,我会得到奇怪的结果。特别是,无论立方体是如何旋转的,围绕y轴的旋转始终围绕窗口的y轴旋转。
我的绘图代码如下:
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity();
gluLookAt(0.0, 5.0, 15.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
glPushMatrix();
glRotatef(theta_y,0,1,0);
glRotatef(theta_x,1,0,0);
glRotatef(theta_z,0,0,1);
draw_cube();
glPopMatrix();
这个问题似乎完全描述了我想做什么,公认的答案似乎是我想做的,然而他提供的链接已经失效。
根据我在链接问题中收集到的信息,我的z旋转是首先执行的,这意味着在我的x旋转(下一个)中,我需要绕(1,0,0)旋转,而不是绕(-sin(theta_z),cos(theta\oz),0)旋转。但对于第三轮,他只给出了链接,说它变得"非常复杂"。现在链接已经死了,我不知道如何进行第三轮。
编辑:根据回复,我添加了三个矢量:cube_x
、cube_y
和cube_z
,以保持多维数据集的当前轴。它们初始化如下:
float cube_x[] = {1.0f,0.0f,0.0f,0.0f};
float cube_y[] = {0.0f,1.0f,0.0f,0.0f};
float cube_z[] = {0.0f,0.0f,1.0f,0.0f};
回到绘图功能中,我对其进行了更改,使旋转围绕这些轴进行,而不是像以前那样围绕全局轴进行。在执行了三次旋转之后,我调用glGetFloatv
来获得当前矩阵,并使用一个新函数update_vector
来用它们的新值填充我的立方体向量。这一切都包括在下面:
void update_vector(float vector[],float matrix[]) {
vector[0] = matrix[0]*vector[0] + matrix[1]*vector[1] + matrix[2]*vector[2] + matrix[3]*vector[3];
vector[1] = matrix[4]*vector[0] + matrix[5]*vector[1] + matrix[6]*vector[2] + matrix[7]*vector[3];
vector[2] = matrix[8]*vector[0] + matrix[9]*vector[1] + matrix[10]*vector[2] + matrix[11]*vector[3];
vector[3] = matrix[12]*vector[0] + matrix[13]*vector[1] + matrix[14]*vector[2] + matrix[15]*vector[3];
}
void my_display(void) {
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) ;
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity();
gluLookAt(0.0, 5.0, 15.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
glPushMatrix();
glRotatef(theta_y,cube_y[0],cube_y[1],cube_y[2]);
glRotatef(theta_x,cube_x[0],cube_x[1],cube_x[2]);
glRotatef(theta_z,cube_z[0],cube_z[1],cube_z[2]);
//get the current matrix
float my_matrix[16];
glGetFloatv(GL_MODELVIEW_MATRIX, my_matrix);
//Multiply the matrix by each of my vectors
update_vector(cube_x,my_matrix);
update_vector(cube_y,my_matrix);
update_vector(cube_z, my_matrix);
make_cube();
glPopMatrix();
/* buffer is ready */
glutSwapBuffers();
return ;
}
现在,当我试图绕y轴旋转时,立方体似乎沿着几个轴摆动了一段时间,最后才变成绕x轴旋转。绕Z轴旋转也会做同样的事情。似乎只有绕x轴旋转才有效。
编辑:解决方案:
在下面的评论中,Gavin提到Y轴旋转总是首先发生。这就是问题的全部。通过添加标志ROT
并根据我试图绕哪个轴旋转来设置它,我可以对旋转进行排序,以便最后完成绕哪个轴的旋转。
LookAt之后,您必须平移到立方体的负位置,进行旋转,然后平移回立方体的位置。
我不知道什么应该很复杂。OpenGL为您进行矩阵运算。记住矩阵乘法是关联的,所以如果Rx等是围绕坐标轴的旋转,那么Rx.Ry的意思是围绕y然后x旋转。无论你的形状在这段时间内结束在哪里,它总是围绕坐标轴。顺便说一句,OpenGL ES是右手的,不同于传统的OpenGL。
- 形状对象的旋转和缩放不正确C++
- 如何在OpenGL中正确旋转和缩放对象?
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 如何围绕对象旋转相机?
- 如何在 opengl 中仅旋转特定对象而不影响其他对象?
- 将四元数旋转的游戏对象旋转另一个四元数时出现问题
- 鼠标单击 OpenGL 时无法围绕其自己的中心旋转对象
- 无法在D2D1中旋转对象
- 如何使用OpenCV从图像中检测旋转对象
- OpenCV 检测多个旋转的缩放对象
- OpenGL c++ 中的旋转子对象
- 无法从非原点的其他位置旋转对象
- 在Qt5的OpenGL绘图中通过鼠标移动计算对象旋转角度
- 围绕另一个对象旋转对象
- 矩阵乘法 opengl 围绕对象旋转
- 对象旋转/平移后重新计算AABB正确
- 围绕另一个对象旋转的物体不断加速
- 在 C++/OpenGL 中围绕另一个对象旋转投影一个对象
- 如何在OpenGL中将对象旋转一定程度?有内置的命令吗?或者我必须使用公式吗
- 如何在其他部件旋转时阻止对象旋转