在正交投影下,物体和观察者之间的距离并不影响它的看上去的大小,这种类型的投影常用于工业制图和计算辅助设计等。因为在这类应用中,物体经过投影过后,保持它们的实际大小和它们之间的角度才是至关重要的。
一、平面上的正交投影
已知点P为平面上确定的一点,平面的法向量为N,则平面上的任意一点M满足平面的点法式方程:
N • (M - P) = 0
设X为平面外的一点,它在平面上的投影点为Y,如下图所示:
根据向量的加法运算有:
与法线N进行点积运算,可得如下等式:
将公式(2)代入公式(1),整理可得:
二、3D中的正交投影
正交投影的视景体定义了,
三、归一化
在OpenGL的正交投影中,视景体中的3D点会被映射到立方体(NDC)中。x坐标的范围从[l,r]到[-1,1],y坐标的范围从[b,t]到[-1,1],z坐标的范围从[n,f]到[-1,1]。
设E为视景体中的任意一点,则有:
投影后的点P,映射到NDC的点为Z,则:
三、代码实现
template<typename N> Matrix4x4<N> Matrix4x4<N>::Ortho(N left, N right, N bottom, N top, N zNear, N zFar) { Matrix4x4<N> prjMat; prjMat.m11 = 2/(right - left); prjMat.m22 = 2/(top - bottom); prjMat.m33 = -2/(zFar - zNear); prjMat.m41 = -(right + left)/(right - left); prjMat.m42 = -(top + bottom)/(top - bottom); prjMat.m43 = -(zFar + zNear)/(zFar - zNear); return prjMat; }