伪代码:
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
这是正确的(或者至少不是可怕的)方式吗?
您可能根本不应该调用glLookAt
。您肯定不希望将每个对象都绘制在屏幕的中间。您对对象更改模型视图矩阵而不将其放回有问题吗?使用glPushMatrix
和glPopMatrix
,而不是重复look-at计算。
不,只需调用一次即可"设置相机",然后绘制所有对象,然后通过在世界空间中应用它们自己的变换进行相应的变换。
编辑:正如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版本/配置文件中,此功能已被弃用。