计算机图形学入门05:投影变换

ops/2024/10/21 12:00:44/

1.投影变换

        上一章已经介绍了投影变换,就是将三维图像投影到二维平面上,而投影变换又分为正交投影(Orthographic Projection)透视投影(Perspective Projection)。如下图:

正交投影

        没有近大远小的现象,无论图形与视点距离是远是近,图形多大画出来的图形就是多大。假设相机距离拉到无限远,远近物体的大小无限接近,所以显示不同距离的物体画面显示一样大小。正交投影会通过远近裁剪面、前后裁剪面、上下裁剪面六个面确定一个可视空间,在可视空间中的物体才能被看到,被映射在近裁剪面(Near clip plane)上。

透视投影

        有近大远小的现象,更接近肉眼看到的画面,应用更加常见。假设相机放在某一个点投射出一个视锥空间,在视锥空间中通过近裁剪面和远裁剪面(Far clip plane)可以裁出一个椎体空间,这个空间称为透视投影的可视空间,在可视空间里的物体被映射到近裁剪面上。

2.正交投影

2.1简单的理解

        1.相机在原点,方向是-z方向,上方向是Y轴。(上一章提到的相机标准位置)

        2.扔掉z轴。如下图所示,物体映射到平面上跟Z轴坐标无关(这样无法判断物体前后)。

        3.可以看出只要将物体平移和缩放到[-1,1]²矩阵里。到这个矩阵为了之后方便计算。

2.2正式推导正交投影矩阵

        我们想要将一个长方体[l,r]×[b,t]×[f,n]映射到标准立方体(canonical cube)([-1, 1]³)中,表示对空间的某一块进行正交投影。这个变换过程就是先平移再缩放。如下图所示:

        

        上图中的立方,l,r表示左边界和右边界,b,t表示下边界和上边界,f,n表示远裁剪面和近裁剪面。由于相机向-z方向看去,所以离相机越近意味着z值越大,离相机越远z值越小,所以这里z值越大距离相机越近,z值越小距离相机越远。

正交投影矩阵

        先平移到原点(两点相加除以2等于中心点),然后缩放(长、宽、高变为2)。原本长方体长宽高覆盖范围分别为r-l,t-b,n-f,缩放到2,因为标准立方体-1到1直接范围是2。

        合并后最终正交投影矩阵为:

3.透视投影

        在推导之前先回忆下齐次坐标的性质。坐标(x,y,z,1),(xk,yk,zk,k!=0),(xz,yz,zz,z!=0)在3D中都表示同一个点(x,y,z)。例如(1,0,0,1),(2,0,0,2)都表示(1,0,0)这个点。

3.1推导透视投影矩阵思路

        推导思路是将透视投影的视锥体“压扁”长方体,做正交投影。如下图所示:

        在挤压过程中,要保证近裁剪面不变,z值不发生变化,远裁剪面的中心点也不发生变化。挤压完成后就变成正交投影矩阵,所以要求透视投影矩阵就变成了先求透视投影到正交投影的变换矩阵,再进行正交投影矩阵。

3.2推导透视投影矩阵

        下图是透视投影的侧视图:

        如上图所示要将点(x,y,z)移到与点(x’,y’,z’)一样的高度和水平宽度,需要将y移到y’x移到x’。根据图中的相似三角形性质,可得出两者的关系:

        根据齐次坐标性质,给每个分量都乘以z,得到远裁剪面上的点与近裁剪面的点映射关系:

        那么得到的这个挤压后远裁剪面的点,肯定是由远裁剪面乘以某个变换矩阵得到,也就是透视投影到正交投影的变换矩阵。

        然后根据矩阵相乘的性质,反推算出这个变换矩阵,只有第三行还不知道。

        第三行势必跟z有关系,而在挤压过程中近裁剪面上任何的点z值都不发生变化的。而近裁剪面的z值就是n,近裁剪面矩阵乘以这个M(4x4)矩阵一定等于它自己(点坐标一样)。所以可以代入做如下处理。

       根据矩阵乘法反推,因此M(4x4)矩阵第三行必须是(0,0,A,B)AB为自己命名。推导:x*0+y*0+A*n+B*1 = n²

        所以得到An+B = n²

        又因为在挤压过程中远裁剪面上任何的点z值也都不发生变化的。拿到远裁剪面上的中心点(0,0,f),这个中心点在挤压前和挤压后x,y的值也不变。

        所以与近裁剪面同理,将远裁剪面中心点代入处理可得。

        将上面得到的关系表达式,整理计算得到AB的值。

        至此,矩阵第三行得到(0,0,n+f,-nf),代入可得透视投影到正交投影的变换矩阵。

        挤压完成变成正交投影之后,就交给正交投影矩阵完成了。

3.3透视投影矩阵

        上述已经求得了透视投影到正交投影的变换矩阵,再进行正交投影矩阵,即是透视投影矩阵。(矩阵相乘从右到左应用)

3.4视角和宽高比表示透视投影矩阵

        如上图所示,是相机所看到的近剪裁面,然后定义一个宽高比(Aspect ratio)。两条红色虚线分别为上下边缘的中心,这两条线组成的夹角称为垂直方向视角(fovY),定义相机能够看到的视角范围。这就是我们用来定义透视投影这个视锥需要定义的两个概念,即宽高比和垂直方向视角。通过宽高比和垂直方向视角,就可以推出水平方向视角。

        那么如何将宽高比和垂直方向视角带入到l、r、b、t中呢?

        如下图为上诉视锥的侧视图上半部分,可以得出下图右侧三角关系的规律。注意:因为相机是-z方向,所以n取绝对值。

        由于得到的标准立方体中心在原点坐标,所以可以得出:r + l = 0,r - l = 2,t + b = 0,t - b = 2。带入透视投影矩阵后如下:

        假设垂直方向视角(fovY)=θ,将上述三角关系带入矩阵得到投影透视矩阵如下:


http://www.ppmy.cn/ops/47474.html

相关文章

【一小时学会Charles抓包详细教程】Charles请求Filter(过滤)功能 (9)

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 Charles请求Fi…

SD6210A 低噪声可调电荷泵DC/DC转换器芯片IC

一般描述 该SD6210A是一种低噪声,恒定频率(1.20MHz)开关电容电压倍增器。它产生一个调节输出电压从2.8V到5V的输入与高达250mA的输出电流。低外部零件数(一个飞行电容器和两个小旁路电容的VIN和VOUT)使SD6210A非常适合小型,电池供电的应用新的电荷…

异常概述

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为“异常”。这些异常有的是由于开发者将关键字敲错导致的&#xf…

MyEclipse 新手使用教程

MyEclipse 是一款流行的 Java 集成开发环境(IDE),它提供了许多用于开发 Java 应用程序的功能和工具。以下是一个针对 MyEclipse 新手的详细使用教程: 一、安装和配置 MyEclipse 下载和安装 访问 MyEclipse 官方网站(…

超全面,编程语言汇总,看看哪些语言适合GIS开发?

最近总有很多人关心GIS开发语言的问题,这个确实很重要,毕竟学习一门编程语言需要花费不少时间和精力,找不到合适GIS的编程语言意味着浪费时间。 首先我们来简单看一下常见的编程语言有哪些,后续再给大家介绍哪些语言适合GIS开发&a…

[机器学习] 低代码机器学习工具PyCaret库使用指北

PyCaret是一个开源、低代码Python机器学习库,能够自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具,极大地加快了实验周期,提高了工作效率。PyCaret本质上是围绕几个机器学习库和框架(如scikit-learn、XGBoost、L…

JVM常用概念之锁粗化和循环

1.什么是锁粗化 锁粗化一般指有效地合并几个相邻的锁定块,从而减少锁定开销。如下述代码所示: 锁粗化前代码: synchronized (obj) {// statements 1 } synchronized (obj) {// statements 2 }锁粗化后代码: synchronized (obj)…

qt c++类继承QWidget和不继承有什么区别

class CheckBoxSetting {Q_OBJECT public:CheckBoxSetting(); };和 class CheckBoxSettingsEditor : public QWidget {Q_OBJECTpublic:explicit CheckBoxSettingsEditor(QWidget *parent 0);~CheckBoxSettingsEditor();有什么区别? 这两个类 CheckBoxSetting 和 C…