openGL投影矩阵原理及数学推导

openGL投影矩阵

概述

显示器是2d的。3d场景需要转换为2d图像才能显示在屏幕上。投影矩阵(GL_PROJECTION)用于完成这个工作。投影矩阵将观察坐标(eye coordinates)转换成裁剪坐标(clip coordinates)。然后,裁剪坐标被除以w,转换为规范化的设备坐标(NDC)。

需要记住的一点是,裁剪操作和规范化都由投影矩阵(GL_PROJECTION)完成。下面介绍如何用6个参数(left,right,bottom,top,near,far)构建投影矩阵。

裁剪(clipping)操作是在裁剪坐标上进行的,安排在透视除法执行之前。裁剪坐标xc,yc,zc同wc比较,若每个分量都落在(-wc,wc)外,那么此坐标将被裁剪掉。

openGL投影矩阵原理及数学推导

在透视投影中,3d场景中的点(观察坐标)从平截头体中映射到正方体(NDC)中;x坐标从[l,r]映射到[-1,1],y坐标从[b,t]映射到[-1,1],z坐标从[n,f]映射到[-1,1]。

注意到,观察坐标系是右手系,规范设备坐标系是左手系。这就有,在观察坐标系中,摄像机朝向沿着-z,而在NDC中,方向沿着z。由于glFrustum()只接受正参数,所以构造投影矩阵的时候要变号。

openGL中,3d场景中,观察坐标系下的点被投影到近投影面。下图展示了观察坐标系点(xe,ye,ze)投影到近投影面上的点(xp,yp,zp)。

openGL投影矩阵原理及数学推导

从Top View of Projection看,xe投影到xp,根据等比性质:

openGL投影矩阵原理及数学推导

从Side View of Projection看,yp计算类似:

openGL投影矩阵原理及数学推导

注意到,xp和yp依赖于-ze,这一点要引起重视。在观察坐标被投影矩阵转换为裁剪坐标后,裁剪坐标仍然是同质坐标。在规范化阶段执行透视除法变为规范设备坐标(NDC)。

openGL投影矩阵原理及数学推导

因此,可以将wc的值定为-ze。投影矩阵最后一行为(0,0,-1,0)

openGL投影矩阵原理及数学推导

下一步,将xp,yp映射到xn,yn,此为线性映射[l,r]=>[-1,1],[b,t]=>[-1,1]:

openGL投影矩阵原理及数学推导

将xp,yp带入上面结果:

openGL投影矩阵原理及数学推导

对比(xc/wc,yc/wc)wc=-ze得出上式括号中分别为xc,yc。由上式的结果可以观察出投影矩阵的第一行、第二行值:

openGL投影矩阵原理及数学推导

现在只差第三行。Ze总是映射到-n,但是又需要有区分的z值用于裁剪和深度测试,也需要能够实现逆变换。我们看到,z是不依赖x或y,可以借助wc来分析zn和ze的关系。我们设投影矩阵如下:

openGL投影矩阵原理及数学推导

在观察坐标系中,we等于1,则有:

openGL投影矩阵原理及数学推导

Ze=-n时,zn=-1;ze=-f时,zn=1,将其带入上式有:

openGL投影矩阵原理及数学推导

有(1)有:

openGL投影矩阵原理及数学推导

带入(2)有:

openGL投影矩阵原理及数学推导

将A带入(1)有:

openGL投影矩阵原理及数学推导

将A、B带入zn,ze关系式:

openGL投影矩阵原理及数学推导

最后得到投影矩阵:

openGL投影矩阵原理及数学推导

当视见体是对称的,有r=-l,t=-b,则:

openGL投影矩阵原理及数学推导

由(3)式看到,ze和zn成反比,ze去[-f,-n],有图像看出,在近投影面zn有较高精度,在远投影面精度低,当区间[-f,-n]增大时,靠近远投影面的点的zn由于过分靠近而超出计算机最大精度(z-fighting),即ze在较远处的细小差别不能在zn上得到表达,而具有相同的zn值。所以,区间[-f,-n]应尽可能短,以避免精度问题。

openGL投影矩阵原理及数学推导

正投影

不存在透视计算,要做的只是将一个长方体映射成正方体。

openGL投影矩阵原理及数学推导

openGL投影矩阵原理及数学推导

openGL投影矩阵原理及数学推导

openGL投影矩阵原理及数学推导

齐次项w不再需要,第四行写为(0,0,0,1):

openGL投影矩阵原理及数学推导

当是对称情况时,r=-l,t=-b:

openGL投影矩阵原理及数学推导

相关文档