2010-10-31 31 views
0

我在阅读the documentation for glOrtho而不理解它。glOrtho(-1,1,-1,1,-1,1)完成什么?

我正在看这个调整大小代码的2D绘图,并没有得到为什么一些索引是积极的和一些消极的。该图应该保持平坦,所以我不知道它是否应该做什么:

void reshape(int width, int height) 
{ 

    glViewport(0, 0, width, height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1, 1, -1, 1, -1, 1); 
    //left, right, bottom, top, nearval, farval 
    glMatrixMode(GL_MODELVIEW); 

} 

回答

4

它构造了投影矩阵。 glOrtho将由前一个语句引起的单位矩阵乘以由该函数指定的正交投影矩阵。

具体来说,这次调用glOrtho正在构造一个矩阵,它将(-1,-1,-1)的世界坐标放在屏幕的左下方,以及世界坐标为1,1,1)在屏幕的右上角。所以如果你要绘制三角形:

glBegin(GL_TRIANGLES); 
glVertex3f(-1, -1, 0); 
glVertex3f(-1, 1, 0); 
glVertex3f(1, -1, 0); 
glEnd(); 

它会覆盖屏幕的一半。

请注意,如果您只使用2D,那么最后两个参数并不重要(尽管它们可用于控制图层)。只需使用z = 0来绘制所有内容,并且如果您需要将某些东西放在其他东西的前面,请使用更高的值z值。

+0

什么是glOrtho(0.0f,windowWidth,windowHeight,0.0f,0.0f,1.0f);完成?世界的限制将是windowWidth和WindowHeight,对吧? – andandandand 2010-10-31 14:44:06

+0

正确,尽管您必须小心使用z = 0进行绘制,因为它将位于z域的边缘(任何与z <0 or z> 1将被隐藏)。如果您打算在z = 0处绘制图画,那么出于安全考虑,最好将范围设置为(-1,+1)。 – 2010-10-31 15:30:25

2

除了翻转z坐标外,它实际上什么都不做。如果你在你的价值观插上你会看到它生成的矩阵

1 0 0 0 
0 1 0 0 
0 0 -1 0 
0 0 0 1 

注意它的单位矩阵,因为glOrtho怪异愚蠢(注意减号):

(left, bottom, -nearVal)(right, top, -nearVal)假定眼睛位于(0,0,0)处,分别指定映射到窗口左下角和右上角的近裁剪平面上的点。 -farVal指定远裁剪平面的位置。

这些减号表示fNearfFar具有相反的含义。