线性代数:裁剪变换(投影变换)(一)

        紧接上一篇:https://blog.csdn.net/yinhun2012/article/details/80218734

        之前我们学习了“顶点机器”变换顶点的一系列过程,其中就谈到了从眼睛空间到裁剪空间的裁剪变换,这篇我们就来学着推导一下这个裁剪变换,毕竟假如我们对于计算机知识只是像看小说看新闻一样,那其实没什么用,前一秒看完后一秒就忘记了。要亲自用纸和笔推导和多遍仔细阅读的记忆才能保证掌握了这个知识点。

        首先我们来观察下我们要变换的眼睛仿射空间和裁剪仿射空间是个什么样子的,如下图:

        

        咋一看就是near面伸缩到2*2的正方形,far面也伸缩成2*2的正方形,同时near和far面的距离伸缩到数值2的范围内,然后绕X轴180°逆时针旋转到Z轴反向(或者绕Y轴逆时针180°),最后平移到坐标系中心就得到结果了。

        但是其中美中不足的地方就是near面和far面都处于在XY平面而且缩放后的大小都是2*2,也就是说near和far缩放不均匀,那么我们并不能用一个缩放矩阵搞定,这样的话我们必须推导出新的矩阵求解near和far以及其距离变换成2*2*2的立方体。

        前面我们学习矩阵推导的时候,也了解到求解矩阵参数,无非是在矩阵T*向量V = 向量V'的情况下,建立T和V的行列相乘=V'的分量的n元一次方程组,然后通过各种数学方法(三角函数几何向量等)预先得到向量V和向量V',再反过来推导矩阵T的参数。如此一来我们就先来求出起码一对眼睛仿射空间和裁剪仿射空间的映射向量。先来随便取一个眼睛视椎体内的顶点坐标P(x,y,z),然后通过边视图和顶视图来观察,如下图:

        

        ps:其中t(top)代表near面y轴正方向长度,b(bottom)代表y轴负方向长度,l(left)代表near面x轴负方向长度,r(right)代表near面x轴正方向长度,n(N)代表near面到坐标中心距离,f(F)代表far面到坐标中心距离。

        我们先假设视椎体中有一点P,然后求出P点在视椎体near面的投影点P',为什么要求出P'呢?主要是为了通过间接方式求出裁剪立方体空间near面上投影点Pv',这样我们就得到最终映射点Pv的x,y分量,同时通过near面到far面的Z轴坐标插值求出depth[-1,1]区间的z值,进而得到最终P的映射点Pv(x,y,z)。接下来我们继续从裁剪立方体的near面观察同时从边视图观察得到depth,如下图:

        

        上图我们通过插值计算出裁剪空间near面投影点Pv'的x、y分量,然后通过裁剪空间边视图计算出z(depth[-1,1])分量,然后组装出眼睛空间中P(x,y,z)的变换映射点Pv(Xv,Yv,Zv)。这时候我们就已经准备好了求解裁切矩阵T的两个已知量了。

        接下来我们怎么构建变换矩阵T呢?其实还是通过线性方程组,同时我们还能直接得到观察线性方程组的参数值,如下图:

        

        这里我们就算出了裁剪矩阵T的具体数值了,别急,我们还没结束,这里先抛出两个问题:

        第一:我们还没使用程序计算推导的结果是否正确呢?这是因为篇幅长了点,我准备下一篇立刻开始根据这篇的计算结果进行程序验证!

        第二:我们可以观察到推导出的矩阵T的数值中居然带有P(x,y,z)的z分量,这可是一个未知值!虽然我们程序可以直接传入z的值,但是这种矩阵并没有完全的“解耦”,我们写程序都追求低耦合,这里别慌,等我们验证完这个矩阵的正确性之后,我再使用fov(field of view)这个参数进行新的换算推导,得到新的“解耦”后的矩阵T。


猜你喜欢

转载自blog.csdn.net/yinhun2012/article/details/80336487
今日推荐