2012-04-27 69 views
1

我一直在研究计算机图形学,我很困惑的视口,gluortho和何时使用GL_MatrixMode和GL_Projection的作用。 这是我写的一个示例代码,让我困惑。Opengl:视口,剪裁,matrixtmode混淆

void init() 
{ 
    glClearColor(1.0,1.0,1.0,1.0);//Background Color of Viewport 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-200,200,-200,200,-50,50); 
    glMatrixMode(GL_MODELVIEW); 
} 

void wheel() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1,0.2,0.2); 
    glLoadIdentity(); 
    glViewport(0,0,200,200); 
    glutSolidCube(100); 
    glFlush(); 
} 
void main(int argc,char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitWindowSize(400,400); 
    glutInitWindowPosition(400,400);//Position from the top left corner 
    glutCreateWindow("Car"); 
    init(); 

    glutDisplayFunc(wheel);//Shape to draw 
    glutMainLoop(); 
} 

当我将Cube的大小更改为200时,它会消失,为什么?那是因为它比z剪辑大吗? 当我删除glMatrixMode(GL_MODELVIEW)立方体消失为什么? 如果我在显示功能结束时没有刷新,立方体也会消失,为什么? 当我使视口变小时,对象变小意味着对象坐标是相对于视口而不是世界坐标?

回答

4

当您将立方体大小更改为200时,它的面会超出近距和远距剪取平面,您在glOrtho呼叫中将其设置为-50和50.从技术角度而言,您可以查看立方体,但立方体的远侧也在远剪切平面之外,所以你看不到它的背面。

删除调用以将矩阵模式设置为GL_MODELVIEW意味着您的glLoadIdentity调用对固定功能投影矩阵(我敢肯定)进行操作,因此该立方体被直接转换为标准化设备坐标,并且它再次延伸超越所有裁剪平面。

最后,glViewport定义了您应该呈现的缓冲区的大小,因此通常与您的屏幕大小相匹配。有效缩小屏幕尺寸,但不会改变实际的GLUT窗口尺寸。用数学术语来说,它改变了片段从标准化设备坐标投影到屏幕坐标的方式。