图形学笔记 —— 透视除法

154 篇文章 8 订阅

图形学笔记 —— 透视除法

本文采用左手坐标系,即z轴向屏幕里增长。

透视投影变换

透视投影变换,有三个词组成:透视、投影、变换。我们逐个来理解。

  • 透视:我理解为“有远近感”的,也就是我们平时所说的近大远小。而相对地,近少远多:你站在山顶上,近处你只能看见附近几棵花花草草,但是远处你可以远眺整个城市这么多东西。如果你把人视野内的东西还原回去三维,它们大概会分布在一个圆台上,不是么。
  • 说到投影你会想到什么?如果是我,我会想到降维。将一条平面上的线段投影到一维的坐标轴上,将一个三维上的物体投影到二维平面上,这就是我们平时接触到的投影。透视投影变换,就是后者,将三维的物体拍扁成二维的。好了,这个“二维的地方”是哪里呢:就是视网膜了。
  • 变换:就是线性变换,这说明我们需要用一个矩阵去把它表达出来,一个齐次坐标变换矩阵。

透视投影变换的思路是:将想要变换的点,与瞳孔连接起来,成为一条视线。然后这条视线,与视网膜的交点,就是变换后的点了。

如上图所示,点 (x,y,z)  (x,y,z) 在紫色的视线上穿过瞳孔,在视网膜上成像,像的y坐标y'就是红色的那一段。不过我们知道眼球里的成像是反的,所以实际上我们求的不是红色的那一段,而是与红色那一段全等的绿色那一段。很显然,我们可以找到相似三角的关系,我们假使视网膜(或者绿线)到瞳孔的距离是 z r   zr,那么变换后绿点:

⎧ ⎩ ⎨ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ x  y  z   =yz r z =yz r z =z r =zz r z    {x′=yzrzy′=yzrzz′=zr=zzrz

1/z  1/z 这个因子可以通过令 ω=z  ω=z 来实现,写成矩阵,就是:

⎡ ⎣ ⎢ ⎢ ⎢ z r 000 0z r 00 00z r 1 0000 ⎤ ⎦ ⎥ ⎥ ⎥   [zr0000zr0000zr00010]

透视除法

可以一眼看出,上面那个矩阵的秩只有3,这说明我们损失了一个维度(从这个矩阵的求法也可以看出,损失的是深度z维)。弄丢了深度信息,这使得深度测试和裁剪都非常难以执行。于是我们想了一个办法让深度信息得以保留,这就是透视除法。透视仍然是透视,那么除法是什么呢?稍后有解答。

透视除法的思路是:将视野(平截头体)内所有的东西都变形,然后挤压到一个小立方体里面。就像一个黑洞,当你掉进一个针孔般大的黑洞的时候,你会被挤压得比针孔还要小很多(我不懂物理这是我胡说的)。

好了,用什么数学方法去挤压它呢?答案就是除法:(下图中,两条绿线分别除以两条蓝线)

这样理解:当我们看到一个点的时候,这个点背后的所有物质都不会影响我们看到这个点的位置。将它在平截头体内三个方向的物质数,比上它到镜头前三个方向的物质数,就是这个比值的意义。这样除完之后,再将它规整成一个2x2x2的立方体,然后整个平移到原点周围。这个立方体就叫做规则观察体(CVV, Canonical View Volume)。我们定量分析这个过程,Y方向的视角我们设作 θ  θ (如上图所标注),X方向的视角我们设作 ψ  ψ,平截头体的两个底,前面的叫做近裁剪面,后面的叫做远裁剪面,它们离镜头的距离分别设作 z n ,z f   zn,zf

⎧ ⎩ ⎨ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ x  y  z   =xztanψ/2 =yztanθ/2 =2znzfnf  1=1z (f+nfn z2fnfn )   {x′=xztan⁡ψ/2y′=yztan⁡θ/2z′=2⋅z−nzf−nf−1=1z(f+nf−n⋅z−2fnf−n)

写成矩阵,也即:

⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ cotψ2 000 0cotθ2 00 00f+nfn 1 002fnfn 0 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥   [cot⁡ψ20000cot⁡θ20000f+nf−n−2fnf−n0010]

更直观的求法,就是利用我们需要的是一个确定位置的2x2x2立方体这个条件,用方程将值求出来。

透视投影和透视除法的关系

事实上两者的形式很相似,拿 cotθ2   cot⁡θ2来说,它不就是当那条绿线长度等于1的时候的 z r   zr 么。透视除法比透视投影多出来的,就是对片断的深度信息的保存。另外,将它变换到一个规范立方体中也有利于裁剪的进行:只需要简单地比较坐标是否在正方体中,否则削除这个点,或者截断直线。

本博客所有除标注转载外的文章由 Shihira Fung 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议进行许可。 转载、引用前需联系作者,并署名作者且注明文章出处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值