投影矩阵网上推导一大堆,怎么构建矩阵,怎么运用透视除法等都有说,但说清楚为什么这样做的貌似不多。我现在尝试用矩阵乘法的本质去说明投影矩阵是怎么推导的。
以下向量统一用列向量表示法。
坐标的表达形式(Fundamentals of Computer Graphics, 4th page 135)
看上图,p在世界坐标系下的坐标值有两种表示法:
其中:
u,v是e坐标系下的标准正交基。
从图中可以看到,p在o坐标系下的坐标是(2.5,0.9),在e坐标系下是(0.5,-0.7)。
但按上面两个公式,算出来的值都是(2.5,0.9)。
我们把e下的方程化为矩阵:
从矩阵可以看出(x,y)->(u,v)的转换关系。如下式:
那么,e坐标系下的坐标可由下式求的:
由于[u v]是正交矩阵,所以有:
说了这么多,目的是为了引出下面的推导,世界坐标转到摄像机空间坐标。
上式可写为:
先明确一点:这里说的摄像机矩阵是指世界空间到摄像机的矩阵。
摄像机空间的三个基分别是向量right,up,look,世界空间中的位置是P。以R表示摄像机right向量,U表示up向量,V表示look向量,我们的目的是把R,U,V三个向量分别转换到x,y,z向量。
由于这个向量比较难转换,我们换种思路,把x,y,z轴转到RUV的矩阵是:
由于该矩阵是正交矩阵,那么有
回想一下,在空间中绕一点P旋转,是不是,可以看成先把P移到原点,然后旋转,再移动回P点上。
而摄像机空间,是把摄像机的坐标移动到原点,再把各个轴旋转到xyz轴上。
假设摄像机世界坐标是P,矩阵如下:
把两个矩阵相乘得到最后的lookup矩阵C:
这里解释了为何LookUp矩阵的平移项是-P·R而不是-P,因为是矩阵相乘的结果。
摄像机空间转换矩阵推导完毕后,下一步是从摄像机空间转到投影空间。
我一直在想一个问题,能否用线性代数的投影矩阵来推导出正交投投影矩阵?
根据线性代数的投影矩阵推导公式,假设向量v在平面A[a1 a2]上的投影向量是p,则p可表示为下式:
其中a1,a2是平面的线性组合向量。这里有个限制:A必须是列空间,即A所在的空间一定包含零点。
假设向量v投影到A空间后得到p,我们要求的矩阵是:Pv = p中的P
再有向量r = v - p,则向量r垂直平面A,即向量r与a1和a2都垂直。得到如下式子:
以上两式组合得:
把r = v - p,p=Ax代入上式得
简写成
Ax=p,两边乘以A得
即得投影矩阵
更详细的性质与推导可以看线性代数投影矩阵的相关参考。
下面详细说出相机正交投影推导:
A是XOY平面,v是空间中一点。
然后要把投影坐标映射到NDC空间。NDC是一个归一化的盒子,z范围0-1,x,y都是-1到1,我手动画图来说明。
屏幕x轴的映射关系是
同理屏幕y轴的映射关系是
现在我们把w换成r-l,把h换成t-b,r是投影区域的右X坐标,l是左X坐标,t和b同理。
z轴的映射关系如下:
求得映射方程如下:
最后得到投影矩阵O:
我们看到,P怎么变换也不能变换到O,这是为什么呢?
个人理解:P的行列式是0,没有逆矩阵,意味着你无法知道原来的Z的位置。因为线性代数中的投影矩阵是降维操作,而图形学中的投影是一个线性方程变换。
===============================
看了闫令琪的图形学中的推导,是我看过最好最直观的。
简单来说,正交投影就是把长方体的盒子,转换到中心为0的标准正方体[-1, 1]³。
这里是把z的n和f变换到-1到1中,和上面的[0,1]不一样
上图来源于闫令琪的教程,注意,我这里是左手坐标系,把图修正了。
长方体的平移距离是,矩阵表示为:
Scale就更简单了,l到r缩放到-1到1,缩放因子就是2 / (r - l),其他同理。
正交投影矩阵是:
参考闫令琪的教程,透视投影就是先把Frustum变换到一个box,然后再进行正交投影的过程。
先看这个连接,https://sites.cs.ucsb.edu/~lingqi/teaching/resources/GAMES101_Lecture_04.pdf
后面我再在这里写过程,并把闫令琪留给我们的问题写出来。
首先,齐次坐标的表示:
(x, y, z, 1),(wx, wy, wz, w != 0),(xz, yz, z², z != 0)均表示同一个点。
下一步,如何把frustum变换到正交投影的box?
侧视图:
那么我们要找到一个矩阵,可以把(x, y, z, 1)变换到坐标(x', y', ?, 1) = (yn/z, xn/z, ? 1) = (yn, xn, ? z)
一矩阵乘法的形式表示:
根据矩阵乘法,,row1 = (n, 0, 0, 0),row2和row4也是如此
关键第三行如何求?
但z = n时,经过该矩阵的转换后仍然是n
点乘法则:
当z = f时,仍然按上面的法则推导
解方程组求A,B得:
A = n + f
B = -nf
最后投影矩阵:
假设摄像机坐标本来就已经在原点,l + r = 0,t + b=0。
并且r - l = width,t - b = height
投影矩阵可以写成:
摄像机垂直方向的视角是fov,如下图:
再看下面的式子:
投影矩阵可以最后写成:
如果正交投影中,变换到一个在z是0-1的box,只需要修改Ot和Os矩阵:
这种情况下的投影矩阵可写成:
NDC中x是-1到1,y也是-1到1,而窗口大小分别是width和height。
下面是NDC的坐标与屏幕坐标的映射关系:
对应方程分别是:
屏幕空间的z是0-1之间,我假设这里的NDC的z也是0-1,(opengl是-1,1),z对应的变换如下:
因此得到NDC到屏幕坐标的矩阵S。
做后屏幕坐标就是:
所以,世界坐标到屏幕坐标的最后映射关系是: