我的代码是关于创建2个立方体,然后同时旋转它们,同时移动它们,并同时缩放它们。对于旋转和缩放它们起作用,但移动不起作用。我认为这与我的glTranslatef()有关,但我尝试了所有我知道的方式。
原点是窗口的中心,立方体总是在旋转。
片段代码:
static GLfloat x = 0.0f;
static GLfloat y = 0.0f;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-(1.5f + x), y + 0.5f, 0.3f);
glScalef(xScale, yScale, zScale);
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();
glLoadIdentity();
glTranslatef(1.5f + x, y + 0.5f, 0.3f);
glScalef(xScale, yScale, zScale);
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
if (negative == true) theta[axis] -= 0.5;
else if (negative == false) theta[axis] += 0.5;
if (theta[axis] > 360.0) theta[axis] -= 360.0;
//display();
glutPostRedisplay();
}
void actionKeys(unsigned char key, int x, int y )
{
switch (key)
{
case 'r': case 'R':
x += 0.5f;
glutPostRedisplay();
break;
case 'l': case 'L':
x += 0.5f;
glutPostRedisplay();
break;
case 'u': case 'U':
y += 0.5f;
glutPostRedisplay();
break;
case 'd': case 'D':
y -= 0.5f;
glutPostRedisplay();
break;
}
}
答案 0 :(得分:1)
问题在于actionKeys函数中的变量范围。您有名为x和y的全局变量,函数参数也称为x和y。在actionKeys函数内部,函数参数x和y是正在更新的函数,而不是全局函数。这就是为什么你的运动不起作用的原因,因为永远不会更新x和y全局变量。我建议重命名全局变量,使其具有与函数参数不同的命名约定,以便将来不再遇到此问题。全局变量的常见命名约定是在它们前面添加g(对于全局变量),这样就不会遇到与局部变量的命名冲突。