录十六

持之以恒

OpenGL正交投影矩阵的推导

在正交投影下,物体和观察者之间的距离并不影响它的看上去的大小,这种类型的投影常用于工业制图和计算辅助设计等。因为在这类应用中,物体经过投影过后,保持它们的实际大小和它们之间的角度才是至关重要的。

一、平面上的正交投影

已知点P为平面上确定的一点,平面的法向量为N,则平面上的任意一点M满足平面的点法式方程:

N • (M - P) = 0

X为平面外的一点,它在平面上的投影点为Y,如下图所示:

无标题.jpg

根据向量的加法运算有:

与法线N进行点积运算,可得如下等式:

将公式(2)代入公式(1),整理可得:

二、3D中的正交投影

正交投影的视景体定义了,

三、归一化

在OpenGL的正交投影中,视景体中的3D点会被映射到立方体(NDC)中。x坐标的范围从[l,r]到[-1,1],y坐标的范围从[b,t]到[-1,1],z坐标的范围从[n,f]到[-1,1]。

E为视景体中的任意一点,则有:

无标题.png

投影后的点P,映射到NDC的点为Z,则:


or.png

三、代码实现

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;
}


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © 1999-2019, lu16.com, All Rights Reserved