Изменение системы координат OpenGL

Я использую OpenGL с gluPerspective, что мне нужно сделать, чтобы он использовал систему координат, в которой начало координат находится вверху слева, а не внизу слева?


person Community    schedule 19.05.2010    source источник


Ответы (2)


Я бы сказал, что прямая работа с проекционной матрицей является чистым способом для этой операции. Но если вдруг вам нужна альтернатива:

Вы можете просто использовать glScalef(1.f, -1.f, 1.f), чтобы перевернуть ось.

Это также просто операция над матрицей GL_MODELVIEW или GL_PROJECTION (независимо от того, что в данный момент активно).

person ypnos    schedule 19.05.2010

Вы можете сделать это, перевернув ось y матрицы проекции. Так:

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadMatrix( [1  0  0  0; 
               0 -1  0  0; 
               0  0  1  0; 
               0  0  0  1] ); 
            // ^ pseudo-code, replace with actual matrix

Это должно сделать это.

Вы также можете использовать вызов glMultMatrix с той же матрицей (вместо Push, а затем Load), но этот способ легче изменить (просто вызовите glPopMatrix в стеке GL_PROJECTION позже).

Вы также можете использовать ту же технику, чтобы перевернуть любую из других осей; просто поставьте минус в нужных местах.

person tzaman    schedule 19.05.2010
comment
Разве glLoadMastrix не уничтожит ранее установленную проекцию? Он полностью заменяет проекционную матрицу, а это не то, что просят. - person ypnos; 19.05.2010
comment
Вот для чего нужен вызов glPushMatrix, он помещает существующую матрицу в стек, сохраняя существующее преобразование. Новая матрица составляется вместе с предыдущей, а не заменяет ее. - person tzaman; 19.05.2010
comment
Как я узнал, и как говорится в каждом руководстве в Интернете, которое я нашел, LoadMatrix всегда заменяет матрицу в стеке и никогда не компонуется. PushMatrix полезен только для восстановления исходной матрицы (и отказа от загруженной) с помощью PopMatrix впоследствии. - person ypnos; 26.05.2010