openGL投影矩阵原理及数学推导
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)外,那么此坐标将被裁剪掉。
在透视投影中,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)。
从Top View of Projection看,xe投影到xp,根据等比性质:
从Side View of Projection看,yp计算类似:
注意到,xp和yp依赖于-ze,这一点要引起重视。在观察坐标被投影矩阵转换为裁剪坐标后,裁剪坐标仍然是同质坐标。在规范化阶段执行透视除法变为规范设备坐标(NDC)。
因此,可以将wc的值定为-ze。投影矩阵最后一行为(0,0,-1,0)
下一步,将xp,yp映射到xn,yn,此为线性映射[l,r]=>[-1,1],[b,t]=>[-1,1]:
将xp,yp带入上面结果:
对比(xc/wc,yc/wc)wc=-ze得出上式括号中分别为xc,yc。由上式的结果可以观察出投影矩阵的第一行、第二行值:
现在只差第三行。Ze总是映射到-n,但是又需要有区分的z值用于裁剪和深度测试,也需要能够实现逆变换。我们看到,z是不依赖x或y,可以借助wc来分析zn和ze的关系。我们设投影矩阵如下:
在观察坐标系中,we等于1,则有:
Ze=-n时,zn=-1;ze=-f时,zn=1,将其带入上式有:
有(1)有:
带入(2)有:
将A带入(1)有:
将A、B带入zn,ze关系式:
最后得到投影矩阵:
当视见体是对称的,有r=-l,t=-b,则:
由(3)式看到,ze和zn成反比,ze去[-f,-n],有图像看出,在近投影面zn有较高精度,在远投影面精度低,当区间[-f,-n]增大时,靠近远投影面的点的zn由于过分靠近而超出计算机最大精度(z-fighting),即ze在较远处的细小差别不能在zn上得到表达,而具有相同的zn值。所以,区间[-f,-n]应尽可能短,以避免精度问题。
正投影
不存在透视计算,要做的只是将一个长方体映射成正方体。
齐次项w不再需要,第四行写为(0,0,0,1):
当是对称情况时,r=-l,t=-b: