我已经阅读了一个像这样旋转立方体的代码(只有关键部分):
static GLfloat theta[] = {0.0,0.0,0.0};
static GLint axis = 2;
void display(void)
{
/* display callback, clear frame buffer and z buffer,
rotate cube and draw, swap buffers */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(theta[0], 1.0, 0.0, 0.0);
glRotatef(theta[1], 0.0, 1.0, 0.0);
glRotatef(theta[2], 0.0, 0.0, 1.0);
colorcube();
glFlush();
glutSwapBuffers();
}
void spinCube()
{
/* Idle callback, spin cube 2 degrees about selected axis */
theta[axis] += 2.0;
if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
/* display(); */
glutPostRedisplay();
}
void mouse(int btn, int state, int x, int y)
{
/* mouse callback, selects an axis about which to rotate */
if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0;
if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1;
if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;
}
它在theta
函数之外保留变量display
来跟踪
改变角度。每次它只是重新定义转型
矩阵,然后看起来新的转型是基于
最后一个。
然而,这只是轮换的情况。当旋转和 考虑翻译。我发现很难使用类似的方法 将一些变量保留在外面以跟踪转换并重新定义 每次都是矩阵,因为旋转和翻译不可互换
我的一个想法是使用glPushMatrix
和glPopMatrix
。但我想知道
这是否是处理此类事情的标准方式。
答案 0 :(得分:1)
是的,这是您想要更改模型 - 视图矩阵时的标准方法,即glPushMatrix()
和glPopMatrix()
所做的,将当前模型视图矩阵保存在矩阵堆栈中。< / p>
假设你有第二个物体,一个球体,它的坐标有不同的变化,参数只是在OX轴上用-5进行平移。
如果您尝试:
//for spehere
glTranslatef(-5.0f,0.0f,0.0f):
drawSphere();
//for cube
glTranslatef(-1.0f,0.0f,0.0f)
glRotatef(theta[0], 1.0, 0.0, 0.0);
glRotatef(theta[1], 0.0, 1.0, 0.0);
glRotatef(theta[2], 0.0, 0.0, 1.0);
drawCube();
您实际上将在Ox轴上将您的立方体翻译为-6.0而不是-5.0。
要解决此问题,您只需使用glPushMatrix(), glPopMatrix()
。
//for spehere
glPushMatrix();
glTranslatef(-5.0f,0.0f,0.0f):
drawSphere();
glPopMatrix();
//for cube
glPushMatrix();
glTranslatef(-1.0f,0.0f,0.0f)
glRotatef(theta[0], 1.0, 0.0, 0.0);
glRotatef(theta[1], 0.0, 1.0, 0.0);
glRotatef(theta[2], 0.0, 0.0, 1.0);
drawCube();
glPopMatrix();
这样您可以保存原始的模型 - 视图矩阵,以便为每个对象应用正确的变换。