试用体验网站,深圳专业做网站电话,上海工程咨询协会官网,什么是网站和网页一、问题提出
在GAMES101-Lecture4 Transformation Matrices 一节中#xff0c;闫老师介绍了正交投影和透视投影。
在讲透视投影变换矩阵 M p e r s p → o r t h o M_{persp→ortho} Mpersp→ortho时#xff0c;同学们对矩阵中的z分量是变化的还是不变的有很多争论。即下…一、问题提出
在GAMES101-Lecture4 Transformation Matrices 一节中闫老师介绍了正交投影和透视投影。
在讲透视投影变换矩阵 M p e r s p → o r t h o M_{persp→ortho} Mpersp→ortho时同学们对矩阵中的z分量是变化的还是不变的有很多争论。即下图中z分量经过投影变换后的z底是保持不变依旧等于z还是unknown大家有不同的看法。基于查阅的资料我将在本文中谈一下自己对于这个问题的理解并对投影变换矩阵的计算公式进行解释。
二、投影变换
1. 正交投影 Orthographic Projection
(1). 正交投影目标
将指定立方体内部的点映射变换到正则立方体canonical cube 内。正则立方体是一个中心点在原点(x,y,z)三个分量都在[-1,1]范围内的正方体。 如将下图所示左侧立方体内部的点先经过平移Translate再经过放缩Scale变换后即可投影到正则立方体内。
(2). 正交投影矩阵 M o r t h o M_{ortho} Mortho
正交投影矩阵可以由平移矩阵和放缩矩阵相乘得到 2. 透视投影
(1). 透视投影目标
将视体内部的点映射变换到**正则立方体canonical cube**内。视体 通常是一个 方平截头体可由fov, aspect_ratio, zNear和zFar这几个参数确定。 如下图所示
(2). 透视投影步骤
前面已经简单介绍过正交投影了正交投影相对简单只要进行平移放缩两次变换即可得到。透视投影 相对复杂 透视投影包含两步
将视体变换为立方体 First “squish” the frustum into a cuboid (n - n, f - f) ( M p e r s p → o r t h o M{persp→ortho} Mpersp→ortho) 进行正交投影将立方体变换到正则立方体Do orthographic projection ( M o r t h o M_{ortho} Mortho)
为什么不直接使用平移放缩非仿射变换 求得透视投影矩阵而是需要先将透视投影转为立方体再进行一次正交投影这两步这两步称之为透视规范化 这是因为
规范化使得只需要一个流水线体系就可以进行透视投影和正交投影尽可能位于四维齐次空间中以便保持隐藏面消除和明暗处理所需要的三维信息。透视投影的第一步将视体转到立方体依旧保持各点的z分量信息便于之后进行深度处理等操作简化了裁剪的操作。第一步转为立方体后由于立方体的边都与世界坐标系的x,y,z轴平行因此可以方便地裁剪掉立方体外的点
(3). 透视投影矩阵
在计算透视投影矩阵之前需要明确一点目标投影矩阵M必须是一个固定的矩阵针对视体内的任何一点都使用相同的一个矩阵条件(1)。 我们称第一步中从视体变换到立方体的矩阵 M p e r s p → o r t h o M{persp→ortho} Mpersp→ortho为透视规范化矩阵。 对于空间内的点(x,y,z)这里的x,y,z是变量因为空间需要进行投影变换的点不只一个其变换后的点为(x,y,z)。 其中 x ′ n z x , y ′ n z y , z ′ ? x\frac{n}{z}x, y\frac{n}{z}y, z? x′znx,y′zny,z′?
a. 假设令z不变
即 x ′ n z x , y ′ n z y , z ′ z x\frac{n}{z}x, y\frac{n}{z}y, zz x′znx,y′zny,z′z 我们可以逆向算出对应的透视规范化矩阵 M p e r s p → o r t h o M{persp→ortho} Mpersp→ortho M p e r s p → o r t h o ( n / z 0 0 0 0 n / z 0 0 0 0 1 0 0 0 0 1 ) M{persp→ortho} \begin{pmatrix} n/z 0 0 0 \\ 0 n/z 0 0 \\ 0 0 1 0\\ 0 0 0 1 \end{pmatrix} Mpersp→ortho n/z0000n/z0000100001 矩阵中nzNear是一个常数然而矩阵中的z是一个变量即n/z中的z对于视体中的每一个不同的点都需要一个特定的z值这并不满足条件(1)不是我们想要的我们想要一个固定的、不随目标点变化的矩阵。
b. 假设令z改变
根据a.中的分析可以得出假如令zz那么对于视体中的每个点都需要一个透视规范化矩阵M不能满足条件(1)。 因此我们需要令透视正则变换后的各点z值发生变化以消除透视规范化矩阵M中的变量z。 一个简单的方式是我们先假设此时不知道z等于什么并令x,y和齐次坐标中的w都乘以z。那么 透视规范化矩阵 M p e r s p → o r t h o M{persp→ortho} Mpersp→ortho 可以写为 M p e r s p → o r t h o ( n 0 0 0 0 n 0 0 ? ? A B 0 0 1 0 ) M{persp→ortho} \begin{pmatrix} n 0 0 0 \\ 0 n 0 0 \\ ? ? A B\\ 0 0 1 0 \end{pmatrix} Mpersp→ortho n0?00n?000A100B0
另外由于在投影变换后还需要进行阴影遮挡判断、隐藏面消除和明暗处理等操作因此我们需要保证原始空间中z值小的点在投影正则化变换后的z值依旧小原始空间中z值大的点在投影正则化变换后的z值依旧大条件(2)。 条件(2)也说明z只能跟原始点齐次坐标中的z和w相关跟x,y无关因此可以得到那么透视规范化矩阵 M p e r s p → o r t h o M{persp→ortho} Mpersp→ortho 可以写为 M p e r s p → o r t h o ( n 0 0 0 0 n 0 0 0 0 A B 0 0 1 0 ) M{persp→ortho} \begin{pmatrix} n 0 0 0 \\ 0 n 0 0 \\ 0 0 A B\\ 0 0 1 0 \end{pmatrix} Mpersp→ortho n0000n0000A100B0 除此以外我们还需要令原来在zzNear平面上的点经过变换后依旧在zzNear平面上原来在zzFar平面上的点依旧在zzFar平面上。这是因为我们需要保证 边界上的点变换后依旧在边界上条件(3)。 假如不能保证满足条件(3)那么在经过投影正则化变化后有可能原来在zFar外面的点在变换后到了立方体内了原本 视体 外需要被裁剪掉的点变换到了立方体内这可能导致裁剪错误。 因此根据条件(3)可以得到下面两个公式 ( 0 0 A B ) ∗ ( x y n 1 ) n 2 (0\ 0\ A\ B) * \begin{pmatrix} x \\ y \\ n \\ 1 \end{pmatrix} n^2 (0 0 A B)∗ xyn1 n2 同时 ( 0 0 A B ) ∗ ( x y f 1 ) f 2 (0\ 0\ A\ B) * \begin{pmatrix} x \\ y \\ f \\ 1 \end{pmatrix} f^2 (0 0 A B)∗ xyf1 f2 根据这两个公式即可求得 A n f , B − n f Anf, B-nf Anf,B−nf 这就是投影变换中 M p e r s p → o r t h o M{persp→ortho} Mpersp→ortho的由来。
3. 总结
投影变换的目标是根据给出的 视体 参数fov, aspect_ratio, zNear, zFar等参数计算得到一个投影变换矩阵M这个矩阵需要满足三个条件
条件(1)这个矩阵是唯一固定的即这个矩阵中的元素值只跟视体相关跟视体中点的坐标无关条件(2)经过变换后必须保证各个点的z值相对关系不变即假如点a的z值大于点b的z值那么经过变换点a的z依旧大于点b变换后的z。那么z不能与(x,y,z,w)中的x,y相关只能由z,w确定条件(3)视体边界面zzNear平面和zzFar平面上点的经过变换后依旧在立方体边界面上
为了满足条件(1)z不能等于z除了zzNear和zzFar平面上的点。 为了满足条件(2) M p e r s p → o r t h o M{persp→ortho} Mpersp→ortho第三行 ( ? ? A B ) (?\ ?\ A\ B) (? ? A B) 前两个元素需要等于0。 为了满足条件(3) A n f , B − n f Anf, B-nf Anf,B−nf。
三、参考
1.计算机图形学第六章观察-黄章进-中国科学技术大学 2.GAMES101-Lecture 4:Transformation Matrices