Используя glMatrixMode () подряд? - PullRequest
2 голосов
/ 10 октября 2019

Как можно использовать два разных матричных режима подряд? То есть, скажем, я хочу выполнить некоторые операции, используя glOrtho() для матрицы проекции. Поэтому я звоню glMatrixMode(GL_PROJECTION), а затем выполняю операции. Насколько я понимаю, использование glPushMatrix() приведет к внесению этих изменений в матрицу проекции. Теперь я хочу применить некоторые изменения в матрице вида модели. Я не понимаю, как сделать это правильно. Должен ли я вытолкнуть матрицу, затем вызвать glMatrixMode или просто продолжить с glMatrixMode?

Ответы [ 3 ]

3 голосов
/ 11 октября 2019

glPushMatrix и glPopMatrix предназначены для сохранения / восстановления выбранной в данный момент матрицы. Он используется, например, для подсетей (например, рука робота), где вам нужно вернуться в состояние корневой подсетки ...

Что вы описываете, для чего glMatrixMode. Таким образом, ваш код должен выглядеть следующим образом:

glMatrixMode(GL_PROJECTION);
// here your stuff for setting projection
glMatrixMode(GL_MODELVIEW);
// here your stuff for setting modelview

Вы должны вызывать glMatrixMode перед каждым блоком кода, который манипулирует матрицей. Не ожидайте, что текущая матрица настроена на то, что вы установили в последний раз. Это приводит к путанице позже ... например, многие алгоритмы рисования изменяют вид модели и / или матрицы текстур на ходу, и в вашем коде вы можете получить что-то вроде этого:

glMatrixMode(GL_MODELVIEW);
// here your stuff for setting modelview
glMatrixMode(GL_PROJECTION);
// here your stuff for setting projection

object1.draw();

// and here the current matrix could be changed from the object1.draw()
0 голосов
/ 11 октября 2019
float mat_proj[16];
float mat_model[16];    

glGetFloatv(GL_PROJECTION_MATRIX,mat_proj );
glGetFloatv(GL_MODELVIEW_MATRIX ,mat_model);
glMatrixMode(GL_PROJECTION);glLoadIdentity();
glOrtho(a,b,c,d,e,f);
glMatrixMode(GL_MODELVIEW);glLoadIdentity(); 
//---------
//---------
glMatrixMode(GL_PROJECTION);   glLoadMatrixf(mat_proj);
glMatrixMode(GL_MODELVIEW);    glLoadMatrixf(mat_model);
0 голосов
/ 11 октября 2019
    glMatrixMode(GL_PROJECTION);    glPushMatrix(); glLoadIdentity();
    glOrtho(a, b, c,d,  e,f);// 
    glMatrixMode(GL_MODELVIEW);     glPushMatrix(); glLoadIdentity();


//----------
//----------

    glMatrixMode(GL_PROJECTION);    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);     glPopMatrix();
...