正射投影函数和视口变换的初步理解


glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);  

近平面的坐标是:vz-znear  远平面: vz-zfar

所谓近平面和远平面是相对于人来讲,比较靠外的是近平面,越往坐标负轴即屏幕深处的是远平面。

注意 near和far的数值的计算在gl中是,当前视点的x坐标减去平面x坐标的数值,不要相反了。例如当前视点是(0,0,0),近平面x是5,那么zNear = -5。以此类推

 例如:视点的z坐标是  20  函数的后两个参数分别是10 和 20

那么近平面是10  远平面:0  计算要根据视线的方向,进行控制,向里是负轴方向,向外是正轴方向(opengl的条件下)

 正射投影注意:要将物体在近远两个平面之间



glViewport 是控制图形在窗口的显示位置,定义的左下角就是显示时候的相对零点。
可以如此理解;   投影后的图形会按比例先绘制在glViewport所在窗口上,然后viewport所在窗口以1-1的比例绘制到设备窗口上即最后显示的效果。
所以,如果定义了一个较小的viewport视口,那么最后显示的效果也是缩小的。相反如果定义一个较大的视口,那么会显示放大的图形,若超出边界则会显示一部分。
例如;
void init(void)
{
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB) ;
    glutInitWindowSize(400, 400) ;
    glutCreateWindow("Bezier Line") ;
}

void display(void) 
{
    glClear(GL_COLOR_BUFFER_BIT) ;
    glColor3f(1.0, 0.0, 0.0);
    glLoadIdentity();
    glBegin(GL_LINES) ;
    glVertex3f(0, 0, 0.0) ;
    glVertex3f(400, 400, 0.0) ;
    glEnd();
    glFlush() ;
}

此为创建一个窗口,画了一条直线。注意窗口的大小和直线的坐标。
    glViewport(0,0,w,h);
    glViewport(0,0,w/2,h/2);
    glViewport(-w,-h,w+20,h+20); 

三种视口模式下观察效果,第一种普通模式下,普通效果,窗口的对角线。
第二种模式下,由于viewport的只占了窗口的坐下四分之一,因而可以理解成直线是从viewport的作下到了右上,占满屏幕,但是投射后便知道设备窗口的中心处。
第三种模式下,viewport和窗口只有小部分相交,因而只显示了这一部分。

上面种种,总结就是矩阵变换。属于最后的视口变换。例子中的其他三种变换;模型矩阵变换,视点变换,投影变换全部用的是单位矩阵,因而此处的显示效果仅仅受到视口变换影响。

目前的认识(未必正确);认定窗口的坐标在世界坐标系的原点处,不受其他影响。由于其他三种变换实际并未进行(全部是单位矩阵的缘故),视口坐标系变换后可以计算出相对于世界坐标的位置,此时投影后的图形在视口坐标系上绘制,同样容易计算出它相对世界坐标系的位置,这样比较容易理解最后的效果。
不同的坐标系变换都是讲其由本身的局部坐标变换到世界坐标系下,然后绘图。在程序中体现的是点从世界坐标系出发经过系列变换,似乎总是在遵循局部坐标系,不过是相同问题不同角度出发的看法。不过,既然是坐标系变换,应当是将坐标系变换到世界坐标系后 ,在局部坐标系上绘制(其实是废话,当然是在局部中绘制,如果是在世界坐标系下绘制的话,那我们变换有什么意义呢)。




你可能感兴趣的:(buffer,图形)