Я использую учебники 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();
Какую цель выполняет "открытие", а затем восстановление матрицы?
Матрица хранится в виде стека. 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 на этот раз, это работает, потому что мы вытащили последнюю операцию перевода