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

news2024/10/5 13:14:18

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.coloradmin.cn/o/1641045.html

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

相关文章

js APIS part2

什么是事件? 事件是在编程时系统内发生的 动作 或者发生的事情。比如用户在网页上 单击 一个按钮 什么是事件监听? 就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 绑定事件或者注册…

亚马逊云科技AWS免费证书-EC2服务器设计(含题库)

亚马逊云AWS官方程序员专属免费证书又来了!这次证书是关于AWS EC2实例的设计和搭建,EC2作为AWS服务的核心,是学好AWS的第一步。强推没有任何AWS背景和转码的小伙伴去学!学完也能变成AWS开发大神! 证书名字叫Getting St…

Python 植物大战僵尸

文章目录 效果图项目结构实现思路源代码 效果图 项目结构 实现思路 下面是代码的实现思路: 导入必要的库和模块:首先,我们导入了Python的os、time库以及pygame库,还有植物大战僵尸游戏中用到的各个植物和僵尸的类。 初始化游戏和…

一机游领航旅游智慧化浪潮:借助前沿智能设备,革新旅游服务效率,构建高效便捷、生态友好的旅游服务新纪元,开启智慧旅游新时代

目录 一、引言 二、一机游的定义与特点 (一)一机游的定义 (二)一机游的特点 三、智能设备在旅游服务中的应用 (一)旅游前的信息查询与预订支付 (二)旅游中的导航导览与互动体…

【JVM】Java工具(Arthas,APM,Java Agent,JMX)

Java工具 常见的Java工具有以下几类: 1、诊断类工具,如Arthas、VisualVM等。 2、开发类工具,如Idea、Eclipse。 3、APM应用性能监测工具,如Skywalking、Zipkin等。 4、热部署工具,如Jrebel等。 Arthas中 Java Ag…

window 安装ai 基础环境(yolo8,训练推理等)

步骤: 1. python sdk 3.9以上 2. 显卡驱动 可以使用驱动精灵 直接安装N 卡推荐 3. 安装机器学习套件CUDA cuda 安装在PyTorch 需要根 PyTorch版本一致,我的 win-srv 最高支持 12.1 下载地址: https://developer.nvidia.com/cuda-toolkit-archive…

吴恩达2022机器学习专项课程(一)正则化(正则化成本函数正则化线性回归正则化逻辑回归)

目录 一.正则化1.1 正则化的好处1.2 正则化的实现方式 二.正则化改进线性回归的成本函数2.1 正则化后的成本函数的意义2.2 λ参数的作用2.3 不同λ对算法的影响2.4 为什么参数b没有正则化项 三.正则化线性回归的梯度下降3.1 为什么正则化可以在梯度下降迭代中减小w3.2 导数的计…

如何使用 GPT API 从 PDF 出版物导出研究图表?

原文地址:how-to-use-gpt-api-to-export-a-research-graph-from-pdf-publications 揭示内部结构——提取研究实体和关系 2024 年 2 月 6 日 介绍 研究图是研究对象的结构化表示,它捕获有关实体的信息以及研究人员、组织、出版物、资助和研究数据之间的关…

Java Jackson-jr 库使用介绍

介绍 Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API,Jackson-jr 的启动速度更快,包大小更小。 虽然Jackson databind(如ObjectMapper)是通用数据绑定的良好选择…

Redis---------分布式锁Redisson

概述 Redisson入门 第一步&#xff1a;引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version></dependency> 第二步&#xff1a;配置文件 import org.redisson…

django搭建一个AI博客进行YouTube视频自动生成文字博客

文章目录 一、生成Django框架二、项目代码&#xff08;前端&#xff09;1、编写前端代码&#xff08;正文界面&#xff09;1.1、生产html框架1.2、添加live preview扩展1.3、更改title元素中文本1.4、添加CDN&#xff08;CSS&#xff09;样式链接1.5、nav标签1.6、在body标签中…

全面了解俄罗斯的VK开户和Yandex投放及内容运营

俄罗斯的VKontakte&#xff08;简称VK&#xff09;和Yandex是两个重要的在线平台&#xff0c;对于希望在俄罗斯市场进行推广的企业来说&#xff0c;了解如何在这些平台上开户和投放广告以及内容运营是非常关键的。 俄罗斯vk广告如何开户&#xff1f; 通过上海上弦进行俄罗斯V…

ASP.NET网络在线考试系统

摘 要 随着计算机技术的发展和互联网时代的到来&#xff0c;人们已经进入了信息时代&#xff0c;也有人称为数字化时代。数在数字化的网络环境下&#xff0c;学生希望得到个性化的满足&#xff0c;根据自己的情况进行学习&#xff0c;同时也希望能够得到科学的评价&#xff0c…

(4)步态识别论文研读——增强时空显著性的跨视图步态识别

Enhanced Spatial-Temporal Salience for Cross-View Gait Recognition Enhanced Spatial-Temporal Salience for Cross-View Gait Recognition | IEEE Journals & Magazine | IEEE Xplore 摘要:步态识别可以单独或与其他生物特征相结合&#xff0c;用于个人识别和再识别…

242 基于matlab的3D路径规划

基于matlab的3D路径规划&#xff0c;蚁群算法&#xff08;ACO&#xff09;和天牛须&#xff08;BAS&#xff09;以及两种结合的三种优化方式&#xff0c;对3D路径规划的最短路径进行寻优。程序已调通&#xff0c;可直接运行。 242 3D路径规划 蚁群算法和天牛须 - 小红书 (xiaoh…

Redis---------实现更改数据业务,包括缓存更新,缓存穿透雪崩击穿的处理

三种更新策略 内存淘汰是Redis内存的自动操作&#xff0c;当内存快满了就会触发内存淘汰。超时剔除则是在存储Redis时加上其有限期(expire)&#xff0c;有限期一过就会自动删除掉。而主动更新则是自己编写代码去保持更新&#xff0c;所以接下来研究主动更新策略。 主动更新策略…

docker系列9:容器卷挂载(下)

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx docker系列6&#xff1a;docker安装redis docker系…

基于yolov8的苹果腐败检测系统,系统既支持图像检测,也支持视频和摄像实时检测(pytorch框架)【python源码+UI界面+功能源码详解】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的苹果腐败检测系统&#xff0c;系统既支持图像检测&#xff0c;也支持视频和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的苹果腐败检测系统是在pytorc…

QT:label标签/进度条的使用

文章目录 设置不同格式的文本显示图片文本对齐/自动换行/缩进/边距LCDNumber倒计时 ProgressBar进度条 设置不同格式的文本 在文本格式中&#xff0c;存在富文本&#xff0c;makedown格式的文本&#xff0c;还有纯文本&#xff0c;下面就依据这三个进行举例 #include "w…

MySQL-SQL执行流程及原理

1、SQL执行流程 2、查询流程 查询缓存&#xff1a; MySQL服务器如果在查询缓存中存在该SQL语句&#xff0c;就直接将结果返回给客户端&#xff0c;没有就进入解析器解析阶段。&#xff08;MySQL 8.0 删除该功能&#xff09;解析器&#xff1a;在解析器中对SQL语句进行语法及语…