OpenGL: Как сделать новые преобразования, основанные на результате предыдущих преобразований? - PullRequest
1 голос
/ 08 апреля 2011

Я прочитал код, который вращает куб, как это (только ключевая часть):

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. Но мне интересно является ли это стандартным способом борьбы с такой вещью.

Не могли бы вы помочь? Спасибо.

1 Ответ

1 голос
/ 08 апреля 2011

Да, это стандартный метод, который нужно применять, когда вы хотите изменить матрицу просмотра модели, это то, что делают glPushMatrix() и glPopMatrix(), сохраняет вашу текущую матрицу просмотра модели в стеке матрицы.

Допустим, у вас есть второй объект, сфера, которая имеет различные изменения в своих координатах, ради аргумента просто перевод на -5 по оси OX.

Если вы попытаетесь:

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

Вы на самом деле будете переводить свой куб на -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();

Этоспособ сохранения исходной матрицы просмотра модели, чтобы можно было применять правильные преобразования для каждого объекта.

...