Путаница со стеком martix в OpenGL?

0

Я использую учебники Lazy Foo. Я нахожу функции glPushMatrix() и glPopMatrix() очень запутанными. Мне нужно, чтобы кто-то объяснил, как хранятся матрицы, как сделать один из них активным (если это то, что вы бы назвали), а также этот код с сайта Lazy Foo:

void render() 
{ 
//Clear color buffer 
glClear( GL_COLOR_BUFFER_BIT ); 

//Pop default matrix onto current matrix 
glMatrixMode( GL_MODELVIEW ); 
glPopMatrix(); 

//Save default matrix again 
glPushMatrix();

Какую цель выполняет "открытие", а затем восстановление матрицы?

  • 0
    Просто для записи, матричный стек устарел, и вы больше не должны его использовать.
Теги:
opengl
matrix

1 ответ

7
Лучший ответ

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

Вы используете матрицу GL_MODELVIEW, чтобы изменить то, что хотите рисовать. Если модель центрирована на 0,0,0, вы можете использовать операцию преобразования матрицы, чтобы переместить ее в x, y, z во время рисования.

Скажем, вы хотите нарисовать два объекта. Один в x, y, z другой имеет вид a, b, c

translate x, y, z
draw first object
translate a, b, c
draw second object

если вы это сделаете, вы увидите, что второй объект рисуется в x + a, y + b, z + c, потому что второй перевод добавляется к первому. вам нужно использовать push/pop-матрицу для сохранения и восстановления состояния

push matrix //no translation at this point
translate x, y, z
draw first object
pop matrix 
translate a, b, c
draw second object

когда вы нажимаете матрицу, она сохраняет текущее состояние матрицы, которое предполагается находящимся в начале координат. после этого вы переводите эту матрицу с помощью x, y, z, и когда вы снова появляетесь, этот перевод "вернется", и вы вернулись к состоянию, когда вы последний раз нажали матрицу. когда вы переводите на a, b, c на этот раз, это работает, потому что мы вытащили последнюю операцию перевода

Ещё вопросы

Сообщество Overcoder
Наверх
Меню