openGL转换和gluLookAt()

时间:2013-02-28 12:43:10

标签: opengl

我有一个代表简单3D场景的学习项目。我想在一些非原点绘制球体。稍后我将把它作为单独的函数或方法来实现。

我正在使用gluLookAt()设置观点,然后我使用glTranslatef()转换模型视图矩阵,几乎没有偏移和绘制球体。不幸的是,球体未显示。我是否正确接近模型 - 视图矩阵?

void display(void){    
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(1, 0 ,1, 0, 0, 0, 0, 1, 0);    
    glColor3b(197, 96, 63);    
    glPushMatrix(); 
    glLoadIdentity();
    glTranslatef(0.1, 0, 0);
    glutWireSphere(0.2, 20, 10);
    glPopMatrix();     
    glFlush();
}

void reshape(int w, int h){
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho ((float)w/(float)h, (float)-w/(float)h, -1, 1, 0.8, 100);
    glMatrixMode(GL_MODELVIEW);
}

2 个答案:

答案 0 :(得分:3)

不,你不是。

gluLookAt(1, 0 ,1, 0, 0, 0, 0, 1, 0); 
glColor3b(197, 96, 63);    
glPushMatrix(); 
glLoadIdentity(); // why it should be there?

通过将视图矩阵归零,您将相对于原点坐标绘制对象,不考虑glLookAt 。对它的调用实际上被忽略了。它应编码为:

  1. 设置“相机矩阵”
  2. 将矩阵推入堆栈
  3. 转换为对象的位置
  4. 绘制对象
  5. 弹出并回到2。
  6. 因此,如果你想设置假想的“相机”,你必须将对象的位置与相机矩阵本身结合起来。

答案 1 :(得分:1)

你的做法看起来并不合理。问题出在这里:

glPushMatrix(); 
glLoadIdentity();
glTranslatef(0.1, 0, 0);

推送(以及后来的弹出)是一个好主意,但是通过在翻译之前将矩阵设置为标识,您将丢失之前完成的任何转换,特别是使用gluLookAt建立的查看转换。因此,只需删除此glLoadIdentity即可正确连接各个转换。

请务必记住,所有矩阵转换函数(例如glTranslateglOrthogluLookat)始终会修改当前选定的(使用glMatrixMode)矩阵并且不要只是替换它。这也是您在调用glLoadIdentityglOrtho之前执行gluLookAt的原因。