【Unity Shader入门精要 第4章】数学基础(二)

1. Unity中的坐标空间

1.1 五个坐标空间

模型空间

  • 模型自身的3D坐标系空间,左手坐标系
  • 是一个相对空间,坐标轴指向随模型旋转变化
  • 当物体有父节点时,Transform组件中各属性的值表示的即为该物体在其父物体的模型空间中的值
  • 当模型顶点传入顶点着色器时,其中的空间信息均为自身模型空间的信息

世界空间

  • 世界3D坐标系空间,左手坐标系
  • 是一个绝对空间,坐标轴指向不会发生变化
  • 当物体没有父节点时,Transform组件中各属性的值表示的即为该物体在世界空间中的值

观察空间

  • 摄像机的模型空间,也是一个3D坐标系空间
  • 是Unity中唯一的一个右手坐标系空间
  • 以摄像机位置为坐标原点
  • 摄像机面向的方向为Z轴负方向

齐次裁剪空间

  • 左手坐标系
  • 其本质是视锥体包围的空间,或摄像机渲染范围的空间
  • 齐次裁剪空间也被称作投影空间,但实际上这时候并没有进行真正的投影,因为还没有对矢量进行降维,该空间仍然是一个3D空间
  • 齐次空间范围内的部分可见,范围外的部分为不可见,需要从渲染中剔除
  • 在透视投影下:
    • 由近裁截面距离、远裁截面距离、FOV以及横纵比决定空间范围
    • 形状为平头四棱锥
    • FOV决定锥体竖直方向的张开角度
    • 根据近裁截面、远裁截面和FOV可以求出近裁截面和远裁截面的高度,根据横纵比可以求出近裁截面和远裁截面的宽度
  • 在正交投影下:
    • 由近裁截面距离、远裁截面距离、SIZE以及横纵比决定空间范围
    • 形状为立方体
    • SIZE决定立方体竖直方向上高度的一半
    • 根据近裁截面、远裁截面和SIZE可以求出近裁截面和远裁截面的高度,根据横纵比可以求出近裁截面和远裁截面的宽度
  • 齐次空间仍然为一个非归一化的三维空间

屏幕空间

  • 左手坐标系
  • 对应当前显示屏幕的2D像素空间
  • 空间范围为(0, 0 )到(ScreenMaxPixelX, ScreenMaxPixelY)

1.2 四个转换过程

模型变换

  • Model Transform —— M
  • 将顶点从模型空间转换到世界空间

观察变换

  • View Transform —— V
  • 将顶点从世界空间转换到观察空间

投影变换

  • Projection Tranform —— P
  • 将顶点从观察空间转换到投影空间(齐次裁剪空间)
  • 根据摄像机的设置不同,分为透视投影(Perspective Projection)和正交投影(Orthographic Projection)两种投影变换方式
  • 同样,这里所谓的投影变换并不是真正进行降维投影,仍然是3D空间到3D空间的变换
  • 所谓投影变换只是对矢量乘以一个变换矩阵(称为投影矩阵或裁剪矩阵),得到矢量在当前齐次空间中真正的齐次坐标
  • 变换矩阵的推导过程并不重要,变换矩阵长什么样也不重要,重要的是我们知道矢量经过与变换矩阵的计算后,其w分量发生了变化,不再是初始的1和0,而是变成了-Z(点)和1(向量)

屏幕映射

  • 以上MVP三种变换都是在顶点着色器中完成的,回忆第二章中渲染流水线的几何阶段,在顶点着色器和屏幕映射阶段之间还有一个必不可少的裁剪阶段,因此在做真正的屏幕映射之前,还需要先进行一步裁剪
  • 上面我们提到过,齐次裁剪空间是一个非归一化的空间,在不同的摄像机设置下,视锥体的范围是不同的,为了能够对不同的视锥体范围进行统一的裁剪处理,需要先将齐次坐标映射到一个统一的范围之内,这一步通过将齐次坐标的所有分量都除以w分量来完成,称为齐次除法(感觉齐次除法就是一个从四维投影到三维的过程)
  • 经过齐次除法后,我们得到了一个(x/w, y/w, z/w, 1)的坐标,称为归一化设备坐标(NDC),而原来的裁剪空间也被投影到了一个(-1,1)的正立方体空间范围(DX为0到1)
  • 此时就可以对所有的NDC坐标进行统一的裁剪处理,只需要考虑坐标是否超出(-1,1)的范围即可
  • 裁剪结束后,所有剩余的顶点都是在屏幕范围内的点,需要根据其X和Y的值映射到(0, 0)至(MaxScreenPixelX, MaxScreenPixelY)的范围内,可以看到,这时候才真正从3D空间投影到了2D空间
  • 剩余的Z值则表示该顶点到屏幕的距离,即深度值

1.3 空间转换图示

在这里插入图片描述

2. 坐标空间变换矩阵

对于坐标空间A和坐标空间B,当我们知道了:

  • B空间的原点 O 在A空间的表示为 OriginalB
  • B空间的 X 轴在A空间的表示为 AxisBx
  • B空间的 Y 轴在A空间的表示为 AxisBy
  • B空间的 Z 轴在A空间的表示为 AxisBz

则从坐标空间B到坐标空间A的转换矩阵MB→A(4*4)为:
( ∣ ∣ ∣ ∣ A x i s B x A x i s B y A x i s B z O r i g i n a l B ∣ ∣ ∣ ∣ 0 0 0 1 ) \left( \begin{matrix} | & | & | & |\\ AxisB~x~ & AxisB~y~ & AxisB~z~ & OriginalB\\ | & | & | & |\\ 0 &0&0&1 \end{matrix} \right) AxisB x 0AxisB y 0AxisB z 0OriginalB1
即将X轴、Y轴、Z轴、原点按列组合形成的4 * 4矩阵(推导过程懒得写了)

由于向量不存在空间位置属性,因此对于向量的变换矩阵可以不关心原点,故可以直接截取3 * 3的轴矩阵 MB→A(3*3):
( ∣ ∣ ∣ A x i s B x A x i s B y A x i s B z ∣ ∣ ∣ ) \left( \begin{matrix} | & | & | \\ AxisB~x~ & AxisB~y~ & AxisB~z~ \\ | & | & | \end{matrix} \right) AxisB x AxisB y AxisB z 

根据以上矩阵可以做如下推导:

  • 对于任意B空间内的向量VB,其在A空间的表示 VA = MB→A(3 * 3) * VB
  • 两边同时乘以 MB→A(3 * 3) 的逆矩阵 MB→A(3 * 3)-1
  • 得到等式 MB→A(3 * 3)-1 * VA = VB

即:MA→B(3 * 3) = MB→A(3 * 3)-1

同时,由于 MB→A(3 * 3)是由坐标空间B的三个坐标轴组合得到的矩阵,而坐标轴组合的矩阵一定是正交矩阵,因此 MB→A(3 * 3)的转置矩阵与逆矩阵相同

因此,此时从坐标空间A反向转换到坐标空间B的转换矩阵 MA→B(3 * 3) = MB→A(3 * 3)-1 = MB→A(3 * 3)T,故 MA→B(3 * 3) 为:
( — A x i s B x — — A x i s B y — — A x i s B z — ) \left( \begin{matrix} — & AxisB~x~ & — \\ — & AxisB~y~ & — \\ — & AxisB~z~ & — \end{matrix} \right) AxisB x AxisB y AxisB z 

3.法线变换

普通的转换矩阵适用于在不同的坐标空间之间对点和普通向量进行空间变换,但是如果直接用该矩阵对法线进行变换,就会出错

这是因为法线并不是空间内真实存在的向量,法线只是对空间内某一平面垂直的一个相对向量,或者说是对空间内真实存在的向量虚构出来的相对向量,具有一定的相对性

当进行空间变换后,这种相对性无法保证依然生效,因此可能导致变换后的法线与变换后的平面并不垂直

而切线是由空间内相邻两点确定的,也就是空间中真实存在的向量,因此可以通过普通的转换矩阵进行空间变换,并且我们可以利用切线来推导出使用于法线的转换矩阵

假设T为切线,N为法线,M为切线的转换矩阵,G为法线的转换矩阵
TB = M * TA
NB = G * NA

由切线与法线垂直可得:
TB · NB = (M * TA) · (G * NA) = 0
注意,上式表示的是两个垂直向量的点乘结果为0

如果将上式改成矩阵乘法来表示,就需要将TB 转置成列矩阵后再与行矩阵 NB 相乘
于是得到:
(M * TAT · (G * NA) = TAT * MT * G * NA = TAT * (MT * G) * NA = 0

由于TAT * NA = 0,因此要使上式成立,只要 MT * G = I,即G = (MT)-1 = (M-1)T

于是问题转化为求普通转换矩阵 M 的逆矩阵 M-1

  • 如果只存在旋转变换,由于旋转矩阵为正交矩阵,M-1 = MT,因此 G = (M-1)T = (MT)T = M
  • 如果只存在旋转变换和统一缩放变换,假设统一缩放系数为K,则G = 1/k * M(这里一直没明白,为什么不是1/k2 * M,有没有大佬给解释一下??)
  • 如果存在非统一缩放变换或平移变换,就只能求逆矩阵了

4. Unity内置变换矩阵

Unity内置了一些变量,可以轻松的获取对应的转换矩阵,这里提供的都是4*4的矩阵

变量作用
_Object2World模型空间到世界空间
_World2Object世界空间到模型空间
变量作用
UNITY_MATRIX_MVP模型空间到齐次裁剪空间
UNITY_MATRIX_V世界空间到观察空间
UNITY_MATRIX_P观察空间到齐次裁剪空间
UNITY_MATRIX_VP世界空间到齐次裁剪空间
变量作用
UNITY_MATRIX_MV模型空间到观察空间
UNITY_MATRIX_T_MV模型空间到观察空间的转置
UNITY_MATRIX_IT_MV模型空间到观察空间的逆转置

5. Unity内置摄像机参数

Unity内置了部分变量可以用来获取对应摄像机参数

变量类型作用
_WorldSpaceCameraPosfloat3摄像机世界坐标
变量类型作用
_ScreenParamsfloat4(width, height, 1 + 1/w, 1 + 1/h)
_ZBufferParamsfloat4(1 - F/N, F/N, x/F, y/F)
_ProjectinParamsfloat4(1/-1, N, F, 1 + 1/F),首位为-1时表示使用的是翻转的投影矩阵
Unity_OrthoParamsfloat4(w, h, _, 0/1) 最后位为0时为透视相机,为1时为正交相机
变量类型作用
Unity_CameraProjectionfloat4x4摄像机投影矩阵
Unity_CameraInvProjectionfloat4x4摄像机投影矩阵的逆矩阵
Unity_CameraWorldClipPlanes[6]float4左右上下远近

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ICDE2024 |VDTuner:向量数据库自动调优技术

在CodeFuse接入实际业务的过程中,大模型的推理成本以及生成内容的准确性是产品规模落地的两个核心考量因素。为了降低推理成本,我们研发了CodeFuse-ModelCache语义缓存加速功能,通过引入Cache机制,缓存已经计算的结果,…

OpenCV 入门(五) —— 人脸识别模型训练与 Windows 下的人脸识别

OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门&#xf…

antdVue 自定义table列配置

最近做项目的时候需要对页面的table进行列配置的需求 子组件 <div><a-modaltitle"列配置" :visible"visible" :closable"false" :footer"null"width"800px" height"448px"><div><a-row>…

【完美解决】使用git时候出现error setting certificate verify locations: CAfile:问题

1、出现场景&#xff1a; 在使用idea的时候&#xff0c;进行git下的push&#xff0c;出现下面的错误&#xff1a; 2、原因分析&#xff1a; 可能因为重装过系统&#xff0c;或者是安装git的位置发生了变化等情况出现。 3、解决方案&#xff1a; 找到git的安装路径&#xf…

Java中Maven的依赖管理

依赖介绍 是指当前项目运行所需要的jar包&#xff0c;一个项目中可以引入多个依赖 配置 在pom.xml中编写<dependencies>标签 在<dependencies>中使用<dependency>引入标签 定义坐标的groupId、rtifactId、version 点击刷新按钮、引入新坐标 例如引入下…

运维实施工程师之Linux服务器全套教程

一、Linux目录结构 1.1 基本介绍 Linux 的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。 在 Linux 世界里&#xff0c;一切皆文件&#xff08;即使是一个硬件设备&#xff0c;也是使用文本来标…

Android(一)

坏境 java版本 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 进入安卓官网下载 勾选协议 next 如果本地有设置文件&#xff0c;选择Config or installation folder 如果本地没有设置文件&#xff0c;选择Do not import settings 同意两个协议 耐…

接入大量设备后,视频汇聚系统EasyCVR安防监控视频融合平台是如何实现负载均衡的?

一、负载均衡 随着技术的不断进步和监控需求的日益增长&#xff0c;企业视频监控系统的规模也在不断扩大&#xff0c;接入大量监控设备已成为一项常态化的挑战。为确保企业能够有效应对这一挑战&#xff0c;视频汇聚系统EasyCVR视频融合平台凭借其卓越的高并发处理能力&#x…

Pandas入门篇(三)-------数据可视化篇3(seaborn篇)(pandas完结撒花!!!)

目录 概述一、语法二、常用单变量绘图1. 直方图&#xff08;histplot&#xff09;2. 核密度预估图&#xff08;kdeplot&#xff09;3. 计数柱状图&#xff08;countplot&#xff09; 三、常用多变量绘图1.散点图(1) scatterplot(2)regplot 散点图拟合回归线(3)jointplot 散点图…

2024年Q1脱毛膏线上市场(京东天猫淘宝)销量销额排行榜

鲸参谋监测的2024年Q1季度线上电商平台&#xff08;天猫淘宝京东&#xff09;脱毛膏行业销售数据已出炉&#xff01; 根据鲸参谋数据显示&#xff0c;今年Q1季度在线上电商平台&#xff08;天猫淘宝京东&#xff09;&#xff0c;脱毛膏的销量累计接近220万件&#xff0c;环比增…

开源代码分享(28)-含分布式光伏的配电网集群划分和集群电压协调控制

参考文献&#xff1a; [1] Chai Y , Guo L , Wang C ,et al.Network Partition and Voltage Coordination Control for Distribution Networks With High Penetration of Distributed PV Units[J].IEEE Transactions on Power Systems, 2018:3396-3407.DOI:10.1109/TPWRS.2018…

OFDM802.11a的FPGA实现(九)星座图映射(含verilog和matlab代码)

目录 1. 前言2. 调制2.1 QAM调制2.2 64-QAM 调制2.3 16-QAM 调制 3.模块实现4.Matlab仿真5.ModelSim仿真6.verilog代码 原文连接&#xff08;相关文章合集&#xff09;&#xff1a; OFDM 802.11a的xilinx FPGA实现 1. 前言 在上一篇博客当中&#xff0c;已经完成了数据域的交织…

计算机毕设

随着社会和国家的重视&#xff0c;大学对于大学生毕业设计越来越重视。 做软件设计设计方面&#xff0c;前后端分离是必不可少的&#xff0c;代码管理工具&#xff0c;前后端接口测试是项目中必须要用到的工具。做大数据设计方面&#xff0c;主要是要用到爬虫进行数据爬取&…

Unity初级---初识生命周期

1. Awake() &#xff1a;唤醒函数&#xff0c;最先执行的函数&#xff0c;只执行一次&#xff0c;当脚本文件挂载的对象被激活时调用 2. OnEnable() &#xff0c;OnDisable()&#xff1a;当脚本启用和禁用时触发&#xff0c;可执行多次&#xff0c;触发的前提是脚本挂载的对象…

奥威-金蝶BI现金流量表模板,可借鉴、可套用

企业现金流一旦出了问题都是大问题&#xff0c;会直接影响到企业的日常运作&#xff0c;甚至直接关系到企业能不能继续存活&#xff0c;因此现金流量表是企业财务分析中重要报表之一&#xff0c;也是企业监控财务监控情况的重要手段之一。那么这么重要的一份现金流量表该怎么做…

大模型模型简化机器人训练;简单易用的 3D 工具Project Neo;特斯拉放出了擎天柱机器人最新训练视频

✨ 1: DrEureka 利用大语言模型自动化将机器人仿真环境训练结果转移到真实世界 DrEureka是一种利用大型语言模型&#xff08;LLMs&#xff09;自动化和加速从仿真&#xff08;sim&#xff09;到现实世界&#xff08;real&#xff09;转移的技术。在机器人技能学习领域&#x…

线程池(一)

1.线程池的基本概念 1.1 什么是线程池&#xff1a; 线程池是一种利用池化技术思想来实现的线程管理技术&#xff0c;主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的…

学习强国手机助手

前景&#xff1a; 用手机刷学习强国时要一直盯着手机&#xff0c;总感觉费时费劲&#xff0c;刚好最近学习python写个小工具帮忙自动学习&#xff0c;实现了文章和视频学习&#xff0c;答题类不一定都能正确。上班时电脑连着USB就可以放那&#xff0c;自己可以上班干自己事情。…

内网端口转发与代理

思路&#xff1a;渗透的前提是双方能够建立通信。目前无法和win7建立通信&#xff0c;但是拿到了windows2003的权限&#xff0c;所以可以在Windows2003主机上面建立节点&#xff0c;作为跳板机去访问到内网。 目前状态&#xff1a;控制win2003&#xff08;IP&#xff1a;192.1…

扩展学习|一文读懂知识图谱

一、知识图谱的技术实现流程及相关应用 文献来源&#xff1a;曹倩,赵一鸣.知识图谱的技术实现流程及相关应用[J].情报理论与实践,2015, 38(12):127-132. &#xff08;一&#xff09;知识图谱的特征及功能 知识图谱是为了适应新的网络信息环境而产生的一种语义知识组织和服务的方…