计算机显示器是一个2D平面。OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上。GL_PROJECTION矩阵用于该投影变换。首先,它将所有定点数据从观察坐标转换到裁减坐标。接着,这些裁减坐标通过除以w分量的方式转换到归一化设备坐标(NDC)。本文主要推导正交投影矩阵和透视投影矩阵。
注意NDC和相机坐标系的不同,NDC是左手坐标系,方向和相机坐标系是相反的。下图是正交投影视景体和NDC坐标系的比较
透视投影
函数1:void glFrustum(GLdouble
left,right指明相对于垂直平面的左右坐标位置
bottom,top指明相对于水平剪切面的下上位置
nearVal,farVal指明相对于深度剪切面的远近的距离,两个必须为正数
矩阵推导:
函数2:gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)
这几个参数分别用于创建透视投影的视景体:
fovy:指定视景体的视野的角度,以度数为单位,y轴的上下方向
aspect,这个好理解,就是实际窗口的宽高比,即x/y
zNear,这个呢,表示你近处,的裁面,
zFar表示远处的裁面,
矩阵推导:(对应于下图第二列的情况)
正交投影
函数:
这几个参数分别用于创建平行视景体的左右上下边界以及远近裁剪面的为位置。
矩阵推导:
关于投影变换的经典例程:
文章参考:http://www.songho.ca/opengl/gl_projectionmatrix.html