摄像头坐标系的形状如下图第一个, 是一个平截头体。
x轴方向上定义 r: right , l: left, y轴方向上定义 t: top, b: bottom, z轴方向上定义 n: near, f: far。
每个摄像头根据焦距的不同,对应的上面的值也会有差别。根据实际情况调整数值。
下图的第二个坐标系就是标准坐标系:NDC(normalized device coordinates),是opengl初始的坐标系。
计算该变换矩阵的原理如下:
假设摄像头坐标系内有一个点(e),则该点在 -n 这个平面上的 X,Y 坐标投影可以通过比例计算出来。
(摄像头坐标系,摄像头所在坐标为原点。这是opengl强制要求)
然后将 -n平面中X,Y 投影点 映射到 NDC 中,比如X 坐标为: [l, r] ⇒ [-1, 1] ,通过线性关系,计算出在NDC的位置
Y轴坐标变换为:[b, t] ⇒ [-1, 1], 其 计算方式与X轴一样,不再重复说明。
最终合并后,将 e 从 摄像头坐标系转到 NDC的 表达式为:
根据上面的公式,我们看到都需要 除以 -ze
我们可以将Wc 的值设为-ze。 (W 数值的作用: 如果W不为0, 那么使用四维向量表示的3维坐标是:)
因此,我们就可以得到变换矩阵的部分数值。
剩余 Z 轴坐标的变换,Z轴坐标用于 裁剪 和 深度测试。 Z轴坐标不依赖于 X,Y轴。因此假设Zn 与Ze 和 We相关,参数设为A,B
在 摄像头坐标系中 ,We 数值为1(X,Y, Z就是真正的坐标位置)。
为了计算A和B 的值, 使用(ze, zn) 映射关系 (-n, -1) and (-f, 1)。
通过计算方程式,最终得到上面的变换矩阵。
(注: 此篇内容参考网页: http://www.songho.ca/opengl/gl_projectionmatrix.html)