1

伪代码:

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

这是正确的(或至少不是非常糟糕的)方法吗?

4

2 回答 2

3

你可能根本不应该打电话glLookAt。您肯定不希望每个对象都绘制在屏幕中间。您是否对更改模型视图矩阵而不将其放回的对象有问题?使用glPushMatrixandglPopMatrix而不是重复查看计算。

于 2012-02-03T22:26:03.020 回答
1

不,调用一次“设置相机”然后绘制所有对象,然后通过在世界空间中应用它们自己的变换来相应地变换它们。

编辑:正如 Ben Voigt 所建议的,您应该适当地推动和弹出以保留此变换,直到所有对象都被绘制。

例子:

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 版本/配置文件中已被弃用。

于 2012-02-03T22:26:30.147 回答