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

2024-06-01 16:52

本文主要是介绍计算机图形学入门05:投影变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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透视投影矩阵

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

这篇关于计算机图形学入门05:投影变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021572

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非