图形学笔记 —— 透视除法

本文采用左手坐标系,即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 =2⋅z−nzf−nf  −1=1z (f+nf−n ⋅z−2fnf−n )   {x′=xztan⁡ψ/2y′=yztan⁡θ/2z′=2⋅z−nzf−nf−1=1z(f+nf−n⋅z−2fnf−n)

写成矩阵,也即:

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

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

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

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

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

图形学笔记 —— 透视除法相关推荐

  1. 计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)

    计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 目录 计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 一.简介 1.模型变换(Model transform ...

  2. 计算机图形学笔记(一)渲染管线概述

    计算机图形学笔记(一)渲染管线概述 写在前面:因为之前有学习过图形学,博文是对过去知识的拾遗和对学习过程中的总结记录,所以在内容组织上可能不符合逻辑,某些比较熟悉的内容不会体现或简述:在整理资料的时候 ...

  3. 软渲染器(Directx11)三之世界矩阵,相机变换矩阵,透视投影矩阵,透视除法,视口变换矩阵

    其实各大矩阵具体的推导过程我就不给出了,我直接给出矩阵具体的形式和实现代码,以及那些大牛推导矩阵详细的文章: 一,世界矩阵(WorldMatrix) 我一般称世界矩阵为SRT矩阵,SRT分别是&quo ...

  4. 图形学笔记(二十)粒子、刚体、流体的模拟—— 欧拉方法、Errors 和 Instability、中点法、自适应步长、隐式欧拉方法、Runge-Kutta方法、刚体与流体模拟(质点法、网格法、MPM)

    图形学笔记(十九)粒子.刚体.流体的模拟-- 欧拉方法.Errors 和 Instability.中点法.自适应步长.隐式欧拉方法.Runge-Kutta方法.刚体与流体模拟(质点法.网格法.MPM) ...

  5. 图形学笔记(十八)光场、颜色和感知—— 光场相机(全光函数、光线和光场的定义)、可见光谱、谱功率密度、颜色的生物学基础、Tristimulus Theory、同色异谱、加色与减色系统、颜色空间SPD

    图形学笔记(十七)相机,棱镜 --FOV.焦距.曝光.F-Stop.ISO.薄透镜公式.Circle of Confusion Size.景深.理想薄透镜光线追踪 图形学笔记(十九)动画1 -- 动画 ...

  6. 图形学笔记 For GAMES201

    图形学笔记 For GAMES201 文章目录 图形学笔记 For GAMES201 Lecture1 taichi 课程地址:GAMES201 in Bilibili 持续更新中- Lecture1 ...

  7. 图形学笔记(十九)动画 —— 动画的历史、关键帧插值、物理仿真、质点弹簧系统、粒子系统、(反向IK)动力学、Rigging 绑定、Blend Shapes、动作捕捉

    图形学笔记(十八)光场.颜色和感知-- 光场相机(全光函数.光线和光场的定义).可见光谱.谱功率密度.颜色的生物学基础.Tristimulus Theory.同色异谱.加色与减色系统.颜色空间SPD ...

  8. 图形学笔记(三)—— Harris角点检测器

    图形学笔记(三)-- Harris角点检测器 前言 CSDN不支持我的公式,大家可以到我的博客:wang-sy.github.io去看 从现在开始学习的是书中的第二章:局部图像描述子.这里主要是寻找图 ...

  9. 图形学笔记(十一)光线追踪——Shadow Mapping、光线追踪、光线投射、软硬阴影、光线与物体交点、AABB包围盒

    图形学笔记(十)几何2 -- 曲面细分(Loop细分.Catmull-Clark细分).曲面简化(边坍缩.二次度量误差).曲面正则化 图形学笔记(十二)光线追踪2--使用AABB包围盒加速光线追踪.空 ...

最新文章

  1. 通过配置NFS使Ubuntu和海思3559A板子共享目录
  2. [学习笔记]几个英语短句(1)
  3. 关于举办第十五届全国大学生智能汽车竞赛浙江赛区选拔赛的通知(草案)
  4. nagios监控mysql主从复制
  5. linux文件的打包与下载总结,linux下文件的打包和压缩
  6. 留言条.html .js来完成
  7. matlab 课程设计循环码性能分析,matlab课程设计--循环码的性能分析
  8. 2d游戏引擎_8年,从2D到3D,我的学习之路
  9. Pytorch学习笔记总结
  10. HTML(超文本语言)
  11. matlab符号运算转置出现conj的解决办法
  12. 2020年中国轴承套圈行业市场现状分析,国内市场格局十分分散「图」
  13. 关于在PLSQL中实现DEBUG调试功能的方法
  14. 涨知识丨一看就懂的遥感数据科普,附5个数据集下载资源
  15. 前端代码规范(依据腾讯团队前端代码规范整理与补充)
  16. 张建宁:“海阔天空”的物联网必须脚踏实地
  17. html倒计时动画,js+css3倒计时动画特效
  18. SPIKE创新科技套装做探路机器人(上)
  19. jquery.countdown.js一个时间倒计时的插件
  20. k8s dns 无法解析

热门文章

  1. 如何分析项目中的数据库
  2. 用函数初步实现比较俩个数字的大小
  3. [MakeFile教程-08] make 的运行
  4. 奥鹏教师计算机培训总结,信息技术应用能力提升培训总结报告
  5. Serverless 的前景和机会
  6. 如何从0设计一套实用可靠的支付服务系统?
  7. 原生js的Ajax实例
  8. multisim找部件记录,设计6进制及31进制记录
  9. matlab mcc 参数,matlab中mcc编译器参数的含义
  10. 安卓app中国际化任何资源的方法