Вызовите gluLookAt () для каждого элемента, который нужно нарисовать? - PullRequest
1 голос
/ 04 февраля 2012

псевдокод:

drawScene() {
    for(every 3Dobject) {
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(eye, targ, up); //is there a better way?
        3Dobject[n].draw(); //this involves calling translations / rotations
    }
    //of course theres 2D GUI stuff to draw next

Это правильный (или, по крайней мере, не Terribad) способ сделать это?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Вы, вероятно, вообще не должны звонить glLookAt. Вы точно не хотите, чтобы каждый объект был нарисован в середине экрана. Есть ли у вас проблемы с объектами, которые изменяют матрицу вида модели и не возвращают ее обратно? Используйте glPushMatrix и glPopMatrix вместо повторного расчета.

1 голос
/ 04 февраля 2012

Нет, вызовите его один раз, чтобы «настроить камеру», а затем нарисуйте все объекты, которые затем соответствующим образом трансформируются, просто применяя их собственное преобразование в мировом пространстве.

РЕДАКТИРОВАТЬ: По предложению Бена Фойгта, вы должны нажать и вытолкнуть соответствующим образом, чтобы сохранить это преобразование, пока все объекты не были нарисованы.

Пример:

gluLookAt(...);

//it is essential to track this state, since there are multiple stacks
glMatrixMode(GL_MODELVIEW); 

for(object : objects){
    glPushMatrix();
    glMultMatrix(object.transform);
    draw(object);
    glPopMatrix();
}

Также хочу отметить, что эта функциональность устарела в новых версиях / профилях OpenGL.

...