[GAMES101]透视投影变换矩阵中为什么需要改变z值

news2024/11/17 4:35:33

透视投影需要保证,1.变换矩阵内的元素是常数,2.相对深度值不变(绝对值不重要);若再加上变换后zNear和zFar平面上的点依旧在zNear和zFar平面上这两个条件(实际上并不一定需要满足这两个条件),那么即可求解得到M矩阵第3行(0,0,a,b)中a,b的取值;

一、问题提出

在GAMES101-Lecture4 Transformation Matrices 一节中,闫老师介绍了正交投影透视投影

在讲透视投影变换矩阵 M p e r s p → o r t h o M_{persp→ortho} Mpersportho时,很多同学对于其中的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, zNearzFar这几个参数确定。
如下图所示:
视体

(2). 透视投影步骤:

前面已经简单介绍过正交投影了,正交投影相对简单,只要进行平移+放缩两次变换即可得到
透视投影包含两步:

  1. 视体变换为立方体, 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} Mpersportho) ;
  2. 进行正交投影,将立方体变换到正则立方体,Do orthographic projection ( M o r t h o M_{ortho} Mortho);

为什么不直接使用平移+放缩+非仿射变换 直接求得透视投影矩阵,而是需要先将透视投影转为立方体,再进行一次正交投影这两步(这两步称之为透视规范化)?
因为:

  • 规范化使得只需要一个流水线体系就可以进行透视投影正交投影
  • 尽可能位于四维齐次空间中,以便保持隐藏面消除和明暗处理所需要的三维信息。透视投影的第一步将视体转到立方体依旧保持各点的z分量信息,便于之后进行深度处理等操作;
  • 简化了裁剪的操作。第一步转为立方体后,由于立方体的边都与空间的x,y,z轴平行,因此可以方便地裁剪掉立方体外的点;
(3). 透视投影矩阵:

在计算透视投影矩阵之前需要明确一点:目标投影矩阵必须是一个固定的矩阵,针对视体内的任何一点,都使用相同的一个矩阵,条件(1)
我们称第一步中从视体变换到立方体的矩阵 M p e r s p → o r t h o M{persp→ortho} Mpersportho透视规范化矩阵
对于空间内的点(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, z'=z x=znx,y=zny,z=z
我们可以逆向算出对应的透视规范化矩阵 M p e r s p → o r t h o M{persp→ortho} Mpersportho
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} Mpersportho= n/z0000n/z0000100001
矩阵中n=zNear是一个常数,然而矩阵中的z是一个变量(即n/z中的z),对于视体中的每一个不同的点,都需要一个特定的z值,这个结果不是我们想要的,我们想要一个固定的、不随目标点变化的矩阵。

b. 假设令z'改变:

根据a.中的分析可以得出,假如令z'=z,那么对于视体中的每个点都需要一个透视规范化矩阵M,不能满足条件(1)
因此我们需要令透视正则变换后的各点z'值发生变化,以消除透视规范化矩阵M中的变量z
一个简单的方式是,我们先假设此时不知道z'等于什么,并令x',y'和齐次坐标中的w'都乘以z。那么 透视规范化矩阵 M p e r s p → o r t h o M{persp→ortho} Mpersportho 可以写为:
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} Mpersportho= n0?00n?000A100B0

另外由于在投影变换后还需要进行阴影遮挡判断、隐藏面消除和明暗处理等操作,因此我们需要保证原始空间中z值小的点,在投影正则化变换后的z'值依旧小,条件(2)
条件(2)也说明,z'只能跟原始点齐次坐标中的zw相关,跟x,y无关,因此可以得到那么透视规范化矩阵 M p e r s p → o r t h o M{persp→ortho} Mpersportho 可以写为:
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} Mpersportho= n0000n0000A100B0
除此以外,我们还需要令原来在z=zNear平面上的点,经过变换后依旧在z=zNear平面上,原来在z=zFar平面上的点依旧在z=zFar平面上。这是因为,我们需要保证 边界上的点变换后依旧在边界上条件(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 A=n+f, B=-nf A=n+f,B=nf
这就是投影变换 M p e r s p → o r t h o M{persp→ortho} Mpersportho的由来。

3. 总结

投影变换的目标是:根据给出物体的参数(fov, aspect_ratio, zNear, zFar等参数),计算得到一个投影变换矩阵M
这个矩阵是唯一固定的,即这个矩阵中的元素值只跟视体相关,跟视体中点的坐标无关,条件(1)
经过变换后,必须保证各个点的z值相对关系不变,即假如点az值大于点bz值,那么经过变换点az'依旧大于点b变换后的z'。那么z'不能与(x,y,z,w)中的x,y相关,只能由z,w确定,条件(2)
并且,视体边界面z=zNear平面和z=zFar平面上点的经过变换后依旧在立方体边界面上,条件(3)
为了满足条件(1)z'不能等于z
为了满足条件(2) M p e r s p → o r t h o M{persp→ortho} Mpersportho第三行 ( ?   ?   A   B ) (?\ ?\ A\ B) (? ? A B) 前两个元素需要等于0。
为了满足条件(3):可以计算得到 A = n + f , B = − n f A=n+f, B=-nf A=n+f,B=nf

三、参考

1.计算机图形学第六章观察-黄章进-中国科学技术大学
2.GAMES101-Lecture 4:Transformation Matrices

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1082700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器人制作开源方案 | 扫地机器人

1. 功能描述 扫地机器人是现代家庭清洁的得力助手,能够自主规划清扫路径,避开障碍物,有效覆盖整个清洁区域。扫地机器人的出现极大地减轻了家庭清洁的负担,节省了时间和精力,它可以定期清理地面,确保家居环…

043:mapboxGL鼠标点击提示source属性信息

第043个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中通过鼠标点击提示source属性信息。这里用到了popup弹窗,用到了click事件,用到了鼠标样式的变化等功能。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源…

正点原子嵌入式linux驱动开发——Busybox根文件系统构建

前面已经移植了TF-A、Uboot和Linux kernel,就剩最后一个 rootfs(根文件系统)了,本章就来学习一下根文件系统的组成以及如何构建根文件系统。这是Linux系统移植的最后一步,根文件系统构建好以后就意味着拥有了一个完整的、可以运行的最小系统 …

【C语言】求解数独 求数独的解的个数 多解数独算法

目录 什么是数独? 数独的解法? 数独DFS算法详解 1. 初始化条件 2. 填入已初始化的数独表 3. 填数独 4. 拓展问题 请问删掉数独中的哪两个数可以使得数独的解最大? 删除的是哪两个数? 最终代码 main函数(如何执行…

前端-uniapp-开发指南

美团外卖微信小程序开发 uniapp-美团外卖微信小程序开发P1 成果展示P2外卖小程序后端,学习给小程序写http接口P3 主界面配置P4 首页组件拆分P13 外卖列表布局筛选组件商家 布局测试数据创建样式 请求商家外卖数据封装请求并发请求 uni-app框架调用https接口 开发小程…

UE4和C++ 开发-C++绑定widget的方式和初始化UI

C绑定widget的方式有两种,一种是使用meta (BindWidget),一种是使用GetWidgetFromName(TEXT("")),两种方式都可以。一、meta BindWidget方式 注意这种绑定的方式UMG里面的空间名称需要与C里面声明的变量名称相同 Btn_StartU 二、GetWidge…

成都瀚网科技有限公司:怎么优化抖店体验分?

近年来,抖音电商平台凭借强大的用户基础和广阔的销售渠道吸引了越来越多的商家入驻。然而,对于新手卖家来说,提高抖店经验值却成了一件头疼的事情。那么,如何优化抖店体验分呢?本文将从产品质量、服务态度、运营策略等…

Springboot集成MyBatis实现查询表操作(二)

目录 第一章、准备1.1)准备数据库表1.2)创建springboot项目,添加依赖1.3)使用mybatis逆向工程 第二章、代码开发2.1)建包并编写代码2.2)application配置文件2.3)设置编译位置 第三章、测试访问3…

【NUMA平衡】浅入介绍NUMA平衡技术及调度方式

在云计算方案设计或项目问题处理的时候,经常会遇到NUMA平衡的问题,进行让人不清楚NUMA到底有何用,如何发挥作用,本文就NUMA技术原理和调度进行简要整理,方便后续需要时候查阅学习。 一.背景 一般的对称多处理器中&am…

基于SpringBoot的新闻稿件管理系统

目录 前言 一、技术栈 二、系统功能介绍 管理员模块的实现 用户信息管理 记者信息管理 审批员信息管理 记者模块的实现 新闻信息管理 审批员模块的实现 新闻信息管理 用户模块的实现 新闻信息 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信…

安装JoySSL的SSL证书有什么优势?

近年来,网络安全事件层出不穷,屡禁不止。 据统计仍有57%的网站未进行https加密,成为数据泄漏的“导火索”之一。 而SSL证书不仅仅可以保护网站数据安全,而且可以降低网站被第三方窃取或篡改的风险。 安装JoySSL证书的好处&#…

kaggle新赛:写作质量预测大赛【数据挖掘】

赛题名称:Linking Writing Processes to Writing Quality 赛题链接:https://www.kaggle.com/competitions/linking-writing-processes-to-writing-quality 赛题背景 写作过程中存在复杂的行为动作和认知活动,不同作者可能采用不同的计划修…

振弦采集仪应用于隧道安全监测

振弦采集仪应用于隧道安全监测 振弦采集仪是当今必不可少的现代隧道安全监测工具。该设备广泛应用于隧道内部各种安全参数的实时监测,包括但不限于隧道变形、裂缝、压力、温度等。本文详细介绍了振弦采集仪在隧道安全监测中的应用。 首先,我们来了解一下…

nodejs+vue宠物店管理系统

例如:如何在工作琐碎,记录繁多的情况下将宠物店管理的当前情况反应给管理员决策,等等。在此情况下开发一款宠物店管理系统小程序, 困扰管理层的许多问题当中,宠物店管理也是不敢忽视的一块。但是管理好宠物店又面临很多麻烦需要解决,于是乎变得非常合乎时…

科技资讯|微软AR眼镜新专利曝光,可拆卸电池解决续航焦虑

微软正在深入研究增强现实(AR)领域,最近申请了一项“热插拔电池”相关专利。该专利于 2023 年 10 月 5 日发布,描述了采用模块化设计的 AR 眼镜,热插拔电池放置在了镜腿部分,可以直接拿下替换,对…

Linux文件目录总结

众所周知,Linux系统文件目录是树状结构,如下图所示: 英文缩写的目录下到底存放的是什么文件,善于做归纳总结的逍遥哥哥来解释一下: /bin:bin是Binary的缩写,这个目录存放着最经常使用的命令。 …

042:mapboxGL点击某feature点,使其为中心点

第042个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中通过鼠标点击某feature点,让其成为中心点。这里用到了click事件和flyTo的方法。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共113行)相关API参…

《设计一款2轮车充电桩系统》

以深圳为例,深圳有400万台电动2轮车,以每个月电费20元计算,深圳每个月用在2轮车充电上的费用为8000万左右。1年10个亿的市场规模。 前景可观,竞争也非常激烈。 本文主要讨论技术实现方案。 方法: 24v/36v直流输出 需…

Linux网络和系统管理

网络管理命令 1、ifconfig 命令 作用 ifconfig 命令用于显示或设置网络设备的信息。格式 ifconfig [网卡名字] [参数]可选项 网卡名字:指定要操作的网络设备。参数: up:启动指定网卡。down:关闭指定网卡。-a:显示所有网卡接口的信息,包括未激活的网卡接口。使用示例 1…

至强服务器BIOS/UEFI驱动开发笔记

至强服务器BIOS/UEFI驱动开发笔记 驱动开发基础Hello UEFI Driver 项目选择项目位置初始化驱动代码文件结构驱动程序入口和基本功能导入AMI工程AMI平台Hello UEFI Driver 编译问题测试结果打印设备列表继续开发`HelloWorldSupported`函数依赖配置使用脚本编译编译测试此DXE驱动…