Мой код о создании 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;
}
}
Проблема связана с переменной областью действия в вашей функции actionKeys. У вас есть глобальные переменные с именами x и y, а параметры функции также с именами x и y. Внутри функции actionKeys обновляются параметры функции x и y, а не глобальные. Вот почему ваше движение не работает, поскольку глобальные переменные x и y никогда не обновляются. Я бы посоветовал переименовать глобальные переменные, чтобы они имели другое соглашение о присвоении имен, нежели параметры вашей функции, чтобы вы не столкнулись с этой проблемой снова в будущем. Общепринятым соглашением по присвоению имен для глобальных переменных является добавление к ним префикса g (для глобальных), чтобы вы не столкнулись с конфликтами имен с локальными переменными.