Unity Shader 开发入门3 —— 坐标空间变换

news2024/12/26 11:48:39

文章目录

  • 一、变换矩阵
    • 1.1 齐次坐标
    • 1.2 平移矩阵
    • 1.3 旋转矩阵
    • 1.4 缩放矩阵
    • 1.5 复合变换
  • 二、世界空间变换
  • 三、观察空间变换
  • 四、裁剪空间变换
    • 4.1 视椎体
    • 4.2 齐次裁剪空间
    • 4.3 视椎体投影方式
  • 五、屏幕空间变换

​ 在 Shader 开发中存在不同的坐标空间,包括:

  1. 模型空间。
  2. 世界空间。
  3. 观察空间。
  4. 裁剪空间。
  5. 屏幕空间。

​ 在渲染管线中,需要将坐标数据在这些空间中进行变换计算。

​ 在设计模型时,使用模型空间。模型导入 Unity 后,最终显示在屏幕上,依次经历了如下空间的坐标变换:

​ 模型空间 -> 世界空间 -> 观察空间 -> 裁剪空间 -> 屏幕空间。

一、变换矩阵

1.1 齐次坐标

​ 齐次坐标是一种在计算机图形学中常用的表示坐标的方式,通过引入一个额外的维度来扩展传统的笛卡尔坐标系,将 n n n 维的向量或矩阵用 n + 1 n + 1 n+1 维来表示,以便进行几何变换和矩阵运算。

(1)举例

​ 三维空间中有一个向量或点 ( x , y , z ) (x , y , z) (x,y,z),对应的齐次坐标为 ( x , y , z , w ) (x , y , z , w) (x,y,z,w),其中 w w w 值的改变可以让它有具有不同的含义。

(2)原因

  1. 通过齐次坐标,可以明确的区分向量和点。

    • w = 1 w = 1 w=1 时,代表一个点。

    • w = 0 w = 0 w=0 时,代表一个向量。

  2. 3 × 3 3\times 3 3×3 矩阵不能直接表示平移变换,只能表示线性变换。

    即,只能描述对象的旋转、缩放等线性变换,而不能描述对象的平移。

​ 平移涉及到改变对象在空间中的位置,包括移动对象的原点。因此,需要引入一个额外的维度

来表示平移操作,用齐次坐标来将 3 × 3 3\times 3 3×3 矩阵加一个维度变为 4 × 4 4\times 4 4×4 的矩阵

  • 3 × 3 3\times 3 3×3 矩阵一般称为线性矩阵,主要处理线性变换(主要进行旋转、缩放等线性变换)。

  • 4 × 4 4\times 4 4×4 矩阵一般称为仿射矩阵,主要处理仿射变换(线性变换 + 平移变换)。

4 × 4 4\times 4 4×4 矩阵的基本构成规则为:

image-20231218170047898
  • M 3 × 3 M^{3\times3} M3×3 部分:用于表示旋转和缩放变换。
  • t 3 × 1 t^{3\times1} t3×1 部分:用于表示平移。
  • 0 1 × 3 0^{1\times3} 01×3 部分:始终为零矩阵。
  • 右下角元素始终为 1。

1.2 平移矩阵

image-20231218170302443

​ 平移矩阵的构成规则为:

  • M 3 × 3 M^{3\times3} M3×3 部分为 3 × 3 3\times 3 3×3 单位矩阵。

  • t 3 × 1 t^{3\times1} t3×1 部分用于表示 x , y , z x,y,z x,y,z 平移多少单位。

(1)与点的计算

image-20231218170447773

​ 点的 x , y , z x,y,z x,y,z 分量分别增加了一个位置偏移。即,点 ( x , y , z ) (x,y,z) (x,y,z) 在 3D 空间中平移了 ( t x , t y , t z ) (tx,ty,tz) (tx,ty,tz) 个单位。

(2)与向量的计算

image-20231218170602402

​ 向量的平移结果不会有任何变化,原因是向量没有位置属性。

​ 对向量进行平移变换,不会改变向量。

1.3 旋转矩阵

​ 旋转操作需要指定一个旋转轴(不一定是空间中的坐标轴)。

image-20231224145954837
  • 旋转矩阵主要由基础变换矩阵的构成规则当中的 3 × 3 3\times 3 3×3 矩阵决定,因此平移部分的 3 × 1 3\times 1 3×1 矩阵都为 0,并不影响计算。
  • 点( w = 1 w=1 w=1)和向量( w = 0 w=0 w=0)与旋转矩阵进行计算都会发生改变。
  • 几何意义是点或 向量围绕某一个轴进行旋转,得到一个新的点和向量。
  • 旋转矩阵是正交矩阵,可以利用旋转矩阵的逆矩阵来还原旋转。

1.4 缩放矩阵

​ 缩放矩阵的构成为以下矩阵结构( k x 、 k y 、 k z kx、ky、kz kxkykz 分别代表 x 、 y 、 z x、y、z xyz 轴的缩放因子):

image-20231224150311332

​ 注意: k x = k y = k z kx = ky = kz kx=ky=kz 时,称为统一缩放,否则称为非统一缩放

  • 点( w = 1 w=1 w=1)和向量( w = 0 w=0 w=0)与缩放矩阵进行计算都会发生改变。
  • 几何意义是 :
    • 对点的缩放(一般是构成模型的顶点),相当于缩放模型大小。
    • 对向量的缩放,统一缩放时只会改变向量的大小(模长),不会改变向量的方向;非统一缩放时不仅会改变大小,可能还会改变向量的方向。

1.5 复合变换

  1. 在进行平移、旋转、缩放的复合运算时:

    绝大多数情况下,我们约定的变换顺序为:先缩放、再旋转、后平移。

P n e w = M 平移 M 旋转 M 缩放 P o l d P_{new}=M_{平移}M_{旋转}M_{缩放}P_{old} Pnew=M平移M旋转M缩放Pold

  1. 在进行 x x x 轴、 y y y 轴、 z z z 轴旋转的复合运算时:

    绝大多数情况下,我们约定的变换顺序为: z → x → y z\rightarrow x\rightarrow y zxy

二、世界空间变换

​ 模型空间(Model Space)也被成为对象空间(Object Space)或局部空间(Local Space),一般指 3D 模型的局部坐标系,每个模型都有自己独立的坐标空间,模型空间的主要意义是便于建模,模型的顶点等数据都是基于模型空间表达的。

​ 注意:

​ 在 Unity 中当模型移动或旋转时,模型空间坐标系也会随着变换,因为模型坐标空间是世界坐标空间的子空间。

​ 世界空间变换指的主要是将模型空间中的点或向量通过矩阵乘法计算,变换为相对于世界坐标空间下数据。

​ 假设机器人模型的手掌红点位置处于模型坐标空间下的:(0.63, 0.84, -0.04)点。当模型在 Unity 中没有任何父对象,那么该模型空间的坐标系相对于世界坐标空间下。

image-20231224151439176 image-20231224151428831

​ 将模型进行 2 倍缩放,进行(0, 45, 0)的旋转,然后再进行(5, 0, 5)的平移,模型坐标空间下的红点(0.63, 0.84, -0.04)相对世界空间坐标是多少呢?
相对世界坐标系的位置 / 向量 = 平移矩阵 × 旋转矩阵 × 缩放矩阵 × 模型空间下的点 / 向量 相对世界坐标系的位置/向量 = 平移矩阵 \times 旋转矩阵 \times 缩放矩阵 \times 模型空间下的点/向量 相对世界坐标系的位置/向量=平移矩阵×旋转矩阵×缩放矩阵×模型空间下的点/向量
image-20231224151634985

三、观察空间变换

​ 观察空间(View Space)也被成为摄像机空间(Camera Space)。观察空间是一个特殊的模型(即摄像机)空间,摄像机可认为是特殊的模型,不可见,但决定屏幕上显示的内容。观察空间的主要意义是决定渲染的视角和视野。

image-20231224151906082

​ 在模型空间中,我们讲过模型空间的 x 、 y 、 z x、y、z xyz 轴,对应模型的右、上、前三个方向,因为 Unity 中的模型空间遵循左手坐标系原则

​ 但在 Unity 的观察空间中,观察空间遵循右手坐标系原则,因此观察空间中的 x 、 y 、 z x、y、z xyz 轴的正方向分别对应摄像机的 右、上、后方。

image-20231224152055293

​ 观察空间变换指将模型空间中的点或向量从世界空间中变换到观察空间中,是顶点变换的第二步,将数据从世界空间 -> 观察空间进行变换。观察空间变换也可以称为观察变换(View Transform)。

  1. 方法一:坐标空间变换。
  2. 方法二:变换观察空间,使观察空间和世界坐标空间重合。

四、裁剪空间变换

4.1 视椎体

​ 摄像机的视锥体是在三维空间中表示摄像机可见区域的虚拟体积,类似一个六面体的形状,根据摄像机的属性和投影方式而定。

​ 视锥体定义了摄像机在场景中能够看到的物体区域,超出这个区域的物体将在渲染时被裁减掉,从而提高渲染性能。

image-20240112200652297

​ 视锥体主要包含 2 部分:

  1. 远近裁剪平面。
  2. 左、右、上、下裁剪平面。

​ 透视投影中,视锥体类似一个金字塔形状,远裁剪面比近裁剪面大,所以产生透视效果。

​ 正交投影中,视锥体类似于长方体的形状,远近裁剪平面大小一致,不会产生透视效果。

image-20240112200751090

​ 由于裁剪需要,判断顶点是否在视椎体范围内相对较麻烦,因此需要将观察空间(摄像机空间)中的数据转换到齐次裁剪空间中。

4.2 齐次裁剪空间

​ 齐次裁剪空间(裁剪空间)是一个三维空间,在计算机图形学中用于在图形渲染过程中进行裁剪和投影。

​ 它的坐标范围为(-1,-1,-1)到(1,1,1),超出这个范围的坐标在渲染时会被裁减掉,只会保留范围内的坐标。

​ 齐次裁剪空间通过将摄像机的视锥体投影到一个规范化的立方体而转换来,这个立方体就是齐次裁剪空间。

image-20240112201054127

4.3 视椎体投影方式

(1)透视投影

​ 视锥体内顶点和原点连接,在近裁剪面的交点为投影点。

image-20240112201322846
  1. 将视锥体中心位移到观察空间原点中心。

  2. 将长方体视锥体的 xyz 坐标范围映射到 (-1,1) 长宽高为 2 的正方体中。

(2)正交投影

​ 视锥体内顶点向近裁剪面做左右裁剪面平行线,在近裁剪面交点为投影点。

image-20240112201406104
  1. 将透视视锥体变成一个长方体。
  2. 将视锥体中心位移到观察空间原点中心。
  3. 将长方体视锥体的 xyz 坐标范围映射到 (-1,1) 长宽高为 2 的正方体中。

五、屏幕空间变换

​ 屏幕空间(Screen Space)指渲染结果在屏幕上显示的坐标空间,三维坐标经过一系列转换后会转换到最终的二维屏幕坐标空间中,使得图像可以在屏幕上进行展示。

​ 屏幕空间的主要意义是屏幕空间中对应的位置信息是真正的像素位置,而不是虚拟的三维坐标。有了相对屏幕空间的坐标位置,才能准确的控制屏幕上像素点的显示效果。

​ 在 Unity 中,屏幕空间左下角为像素坐标(0,0)点,屏幕空间右上角为像素坐标(分辨率宽,分辨率高)。

​ 屏幕空间变换主要指将三维坐标 (x, y, z) 中的 x, y 分量映射到屏幕上,而 z 分量一般会被用于深度缓冲,之后用于深度测试等(决定是否被遮挡等)。

image-20240112202524116

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

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

相关文章

代码随想录 516. 最长回文子序列

题目 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1: 输入:s “bbbab” 输出&…

docker容器运行elaticsearch和kibana,又把ECS跑爆了

就运行了两个容器一个elasticsearch应一个就是可视化的kibana 开始还好好的后来cpu又爆了 最后只有重启ECS然后再启动这两个服务就好了 去网上找了下解决方法。说是正常情况Kibana第一加载非常耗资源。

openssl快速生成自签名证书

系统:Centos 7.6 确保已安装openssl openssl version生成私钥文件 private.key (文件名自定义) openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048-out private.key:生成的私钥文件-algorithm RS…

Vue-14、Vue绑定style样式

1、对象写法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>绑定css样式</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/v…

Win10系统读不出U盘的四种解决方法

有用户特别喜欢用U盘来保存重要的内容&#xff0c;但有用户反映自己的Win10电脑读取不了U盘&#xff0c;这样用户就不能将Win10电脑上的内容传输到U盘了。下面小编带来四种简单有效的解决方法&#xff0c;解决后Win10电脑上的U盘就能被正常识别&#xff0c;从而恢复对U盘的使用…

揭露欧拉骗局4.“Σ1/n²=π²/6”里的猫腻

自然数平方倒数求和Σ1/n是一个并不复杂的问题&#xff0c;但它困扰了欧洲大陆整整90年&#xff0c;在欧系数学里它被称为“巴塞尔级数”。 解决巴塞尔级数让欧拉一战成名&#xff0c;然而欧拉采用的方法对数学这门学问是严重的侮辱。数学是工具学科&#xff0c;数学的宗旨是化…

NAND Separate Command Address (SCA) 接口数据传输解读

在采用Separate Command Address (SCA) 接口的存储产品中&#xff0c;DQ input burst和DQ output burst又是什么样的策略呢&#xff1f; DQ Input Burst: 在读取操作期间&#xff0c;数据以一种快速并行的方式通过DQ总线传送到控制器。在SCA接口下&#xff0c;虽然命令和地址信…

AI绘画软件Stable Diffusion模型/Lora/VAE文件存放位置

型下载说明&#xff08;下载模型后输入对应参数即可生成&#xff09; 建议直接去civitai.com找模型&#xff0c;如果无法找到可以在幕后模型区找也可以去&#xff0c; 下载好后放入对应的文件夹。进入127.0.0.1:7680 左上角刷新即可看到新的模型。 模型种类 大模型 大模型特…

启动Vue项目,报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序

前言&#xff1a; 最近在打开一个Vue项目的时候&#xff0c;打开之后输入命令行&#xff1a;npm run serve之后发现&#xff0c;报错&#xff1a;vue-cli-service 不是内部或外部命令&#xff0c;也不是可运行的程序&#xff0c;以下是解决方案&#xff1a; 报错图片截图&…

【方差分析原理简介】

文章目录 方差分析&#xff08;Analysis of Variance&#xff0c;简称ANOVA&#xff09;1 方差分析流程2 借助sklean进行基于方差分析的特征筛选3 总结 方差分析&#xff08;Analysis of Variance&#xff0c;简称ANOVA&#xff09; 卡方检验更多的会考虑在衡量两个离散变量是…

redis系列:01 数据类型及操作

redis的数据类型有哪些 string,list,set,sorted_set,hash 操作 sting: set name maliao get name exists name expire name 5 ttl name del name setex name 10 maliao 设置key和过期时间 setnx name maliao 当key不存在时才添加list&#xff1a; lpush letter a lpush le…

FPN网络的实现原理详解

1 前言 FPN网络是一种常见的特征融合模块&#xff0c;在很多模型中都有运用&#xff0c;今天我们就结合代码和论文详细的搞清楚它到底是怎么一回事。 2 原理 原理直接看这一张图就可以了&#xff0c;很直观主要就是把对不同层的特征进行融合&#xff0c;重点还是在于代码的理…

SpringBoot项目如何防止反编译?

SpringBoot项目如何防止反编译&#xff1f; 场景方案项目操作启动方式反编译效果绑定机器启动 场景 最近项目要求部署到其他公司的服务器上&#xff0c;但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理&#xff0c;防止客户直接通过反编译工具将代码反编译出…

【服务器】服务器管理 - cockpit开启

开启cockpit #!/bin/bashsed -i s/is():where()/is(*):where(*)/ /usr/share/cockpit/static/login.jssystemctl enable --now cockpit.socket #开启cockpit服务systemctl start cockpit.socket 登录 https://ip:9090

Java--Spring项目生成雪花算法数字(Twitter SnowFlake)

文章目录 前言步骤查看结果 前言 分布式系统常需要全局唯一的数字作为id&#xff0c;且该id要求有序&#xff0c;twitter的SnowFlake解决了这种需求&#xff0c;生成了符合条件的这种数字&#xff0c;本文将提供一个接口获取雪花算法数字。以下为代码。 步骤 SnowFlakeUtils …

一步步指南:从指定时长中提取需求的帧图片,高效剪辑视频

在现代多媒体时代&#xff0c;视频已经成生活中不可或缺的一部分。从视频中提取某一帧图片&#xff0c;或者对视频进行剪辑&#xff0c;都是常见的需求。下面一起来看云炫AI智剪如何从指定时长中提取需求的帧图片&#xff0c;如何高效地剪辑视频。 按指定时长提取视频某帧图片的…

航天民芯一级代理-技术支持-一站式配单 MT9284-28J LED驱动芯片

描述 MT9284是一个升压转换器&#xff0c;设计用于从单电池锂离子电池中驱动多达7个系列的白色led。MT9284使用电流模式&#xff0c;固定频率结构来调节LED电流&#xff0c;它通过外部电流感应电阻来测量。MT9284包括低电压锁定、限流和热过载保护&#xff0c;以防止在输出过载…

探秘Pytest插件pytest-xdist —— 提升测试效率,轻松并行运行测试

在软件开发中&#xff0c;测试是确保代码质量的重要一环。然而&#xff0c;随着项目规模的增大&#xff0c;测试用例的数量也随之增多&#xff0c;测试的执行时间可能成为一个瓶颈。为了解决这个问题&#xff0c;Pytest提供了丰富的插件生态系统&#xff0c;其中 pytest-xdist …

opencv拉流出现missing picture in access unit with size 4错误解决

0、应用场景问题 我们使用opencv作为拉流客户端&#xff0c;获取画面后进行图像处理并推流&#xff08;使用ffmpeg库&#xff09;。 opencv解码同样使用ffmpeg库。 我们要求opencv能根据业务不断进行拉流操作&#xff0c;等效的逻辑代码如下&#xff1a; while(1) {printf(&…

【LangChain学习之旅】—(7) 调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?

【LangChain学习之旅】—&#xff08;7&#xff09; 调用模型&#xff1a;使用OpenAI API还是微调开源Llama2/ChatGLM&#xff1f; 大语言模型发展史预训练 微调的模式用 HuggingFace 跑开源模型申请使用 Meta 的 Llama2 模型通过 HuggingFace 调用 LlamaLangChain 和 Hugging…