unity shader 之基础四 数学

2023-11-16

4.2 笛卡尔坐标系

 笛卡尔坐标系分为二维和三维坐标系

4.2.1二位坐标系

 OpenGL 和 DirectX 二位坐标系是不同的,OpenGL 和 DirectX 是不同的图形访问接口,用来和硬件交互的

 

 二维坐标系 是可以相互转换的,既 任意一个二维坐标系,都可以用由另一个二维坐标系通过旋转  得到,从这种意义上来说,所有的二维坐标系 都是等价的

4.2.2 三维坐标系

三维坐标系中的x ,y ,z 轴叫做该坐标系的 基矢量

如果这三个 基矢量 相互垂直长度为1 ,则称为 标准基矢量 

根据坐标轴方向的不同,分为左手坐标系 和 右手坐标系

旋向性:两个坐标系,可以通过 轴的旋转 重合,则具有相同的旋向性,否则具有不同的旋向性

左手坐标系和右手坐标系,具有不同的旋向性

4.2.3 左手坐标系

上面说了,根据 坐标轴的方向的不同,分为 左右手坐标系

左手坐标系 x 轴方向朝右,y  轴朝上, z 轴垂直于 xy 平面朝里

右手坐标系:

左手坐标系 x 轴方向朝左,y  轴朝上, z 轴垂直于 xy 平面朝里

4.2.4  unity中使用的坐标系

unity的坐标系 分为 模型坐标系 世界坐标系 观察坐标系 裁剪坐标系 屏幕坐标系  视口坐标系 

其中 观察坐标系 使用的是右手坐标系 ,其它的均使用 左右坐标系

4.3 点和矢量

 点 是二维或者三维空间中的一个位置,没有大小,方向等概念 ,二维中用P(x,y) , 三维中用(x,y,z) 表示

矢量 (也称为向量):具有 模(大小) 和 方向 的向量

标量:只有大小 没有方向 

矢量可以认为是一个点相对于另一个点的偏移,是一个相对量。所以如果矢量的模和大小不变,无论放在哪里 ,都是一个矢量

4.3.1 点和矢量的区别

点是空间中的一个位置, 矢量是一个点相对于另一个点的偏移,如果把矢量的尾 固定在原点 ,矢量的表示和点的表示就一样了

4.3.2 矢量运算

包括 矢量的 加 减 ,矢量和标量 的乘除, 其中加减 可以认为是矢量的平移  ,乘除 是矢量的缩放

求矢量的模

4.3.3 单位矢量

单位矢量:是模为1的向量 

一个向量转换成单位矢量的过程 叫 归一化

在计算光照时我们往往需要对向量进行归一化

单位矢量=向量/向量的模

零矢量:(0,0,0),其不能被归一化,以为分母不能为0

4.3.4 矢量的点积(点乘)

通过公式二 可以得知,如果 a b 都是单位矢量,则 a 点乘 b 就等于 二者之间夹角的余弦值 ,可以根据这个 判断两个向量之间的方向关系,a 在 b 的前方 还是后方,只要看余弦值是大于0 还是小于0 就行了

4.3.5 矢量的叉积(叉乘)

 这是有规律的 ,分别是 a的y z x 乘以 b的z x y,每一个都往后错开一位,然后再相减

叉乘得到的是一个垂直于 a b 的向量

但是垂直于ab的向量的方向可以有两个,一个上 一个下, 这就要根据我们前面说的 左右手坐标系有关了,伸出右手,掌心方向和a 方向一样,大拇指方向,就是右手坐标系下  ab 叉乘后的向量的正方向

4.4 矩阵

4.4.1 矩阵和矢量的关系

矢量可以看成一个数组 ,矩阵也可以看成一个数组,这样矩阵就可以看成一个n*1 的列向量  或者 1*n 的行向量

4.4.2 矩阵的运算

矩阵包括 矩阵和标量指点的乘除  

矩阵和矩阵之间的乘法

矩阵不满足交换律 既 AB 不等于 BA

满足结合律

4.4.3 方阵,对角元素,对角矩阵 等

方阵:列数和行数 相等的矩阵 比如 3x3 4x4

对角元素 :矩阵中行号和列号 相等的元素  称为对角元素 比如: m11 m22 m33

对角矩阵:除了对角元素 其它元素都为0的矩阵

单位矩阵:对角元素都为1的对角矩阵  称为单位矩阵  用 I 表示

单位矩阵和任何矩阵相乘  都等于 原矩阵 

转置矩阵(transposed matrix):把原矩阵 行变列  ,这里写英文,是为了加深  unity里面求一个矩阵的转置矩阵的方法叫 transposed(M)

关于转置矩阵的性质

逆矩阵:一个矩阵是否有逆矩阵,前提该矩阵必须是方阵,这是充分非必要条件,是方阵可能有逆矩阵,不是方阵一定没有逆矩阵,零矩阵就没有逆矩阵,因为任何矩阵和它相乘,都是0 ,并不满足我们下面的条件

  逆矩阵的性质

第一个  就相当于a 的倒数的倒数  还是 a

第二个  就相当于 1 的当属 还是1

性质三比较重要,性质四和转置矩阵的性质是一样的 

求一个矩阵的逆矩阵 (增广法)

这个比较简单,也比较高效,所以选择了这个

主要原理:对原矩阵A(n阶) 右边加上一个等阶的单位矩阵E,变成W(A|E)矩阵(n*2n),对w 进行变换,最终变成(E|B),则B矩阵就是A 的逆矩阵

变换方法(高斯消元法)

既 每一行所进行的操作,只有乘以一个标量,再和该矩阵的另一行相加或相减 ,也可不进行加减操作,最后使得 左边矩阵为单位矩阵就行了

例如:

贴吧404

正交矩阵:正交矩阵是方阵的一个特殊矩阵,如果一个方阵的转置矩阵和它相乘 等于 单位矩阵 ,就说他是正交的

性质:

第二个性质  是根据逆矩阵的性质得来的

判断一个矩阵是不是正交矩阵:

比如:

第一个 ,a(1,0,0) b(1,0,0) c(1,0,0) 都是单位矢量  但是  相互之间点乘不等于0

a 点乘 b 等于  1*1+0*0+0*0 =1 不等于0 所以 1 不是

同理  2、3 是正交矩阵

4.5 矩阵的几何意义  变换

线性变换:矢量加 和标量乘的变换

旋转 和 缩放 都是线性变换,如果只考虑旋转,一个3x3 的矩阵就可以表示所有的旋转

仿射变换:只考虑旋转和缩放是不现实的,有时候还要考虑 平移变换  因为平移变换不满足线性变换的条件,所以  结合了线性变换 和平移变换 的类型,就是仿射变换

仿射变换需要4维空间  ,也就是一个4x4 矩阵 ,这个4维空间 叫齐次坐标空间

4.5.1 齐次坐标

用4维空间,表示的坐标 叫齐次坐标 比如 p(x,y,z,w)

一个点 从三维坐标  变成 齐次坐标 只需要设置其 w 为1

一个矢量  从三维坐标  变成 齐次坐标 只需要设置其 w 为0,这是因为  矢量的平移 没有意义  ,只要矢量的模的大小 和 方向不发生变化,就是同一个矢量

4.5.2 基础变换矩阵

我们把纯旋转  ,缩放  ,平移的矩阵  称为 基础变换矩阵

它们有共同的特点   所以 把基础变换矩阵 分解成 4个部分

4.5.3 平移矩阵

点的 w 是1

方向矢量的 w 是0

所以 平移矩阵  的构成  应该是

上图 所示  是平移矩阵的 反方向平移矩阵,也就是 左上角 M矩阵 为单位矩阵 t 矩阵为平移的列向量

平移矩阵不是正交矩阵 ,因为不满足条件,条件可看上面

4.5.4 缩放矩阵

对点 缩放

对矢量 缩放

如果 kx=ky=kz ,既 缩放系数相等,称为统一缩放,否则称为非统一缩放

非同一缩放,会改变模型的比例

缩放矩阵的逆矩阵

4.5.5 旋转矩阵

4.5.6 复合变换(同时包含缩放 旋转 平移)

 阅读顺序  从右往左

而 当旋转时  也是需要一个旋转顺序的  比如 给一个旋转角度(x,y,z),是先按 x 旋转还是先按y轴旋转,还是先按 z 轴旋转?

在 unity 里面 给出的顺序 是 zxy  既 先z 后 x 再 y

所以得出的旋转矩阵是上面的

这并不是写反了,因为按照 z x y 顺序旋转,也有两种旋转方式

第一种  每一次旋转都是独立的,不依赖于上次旋转的结果

第二种 旋转是相互依赖的,上次旋转的结果,影响下次旋转的结果

unity 中使用的是第一种,所以就没有左右之分了

4.6  坐标空间

4.6.1 坐标空间的转换

可以说每个事物都有自己的坐标空间,同时 它也是在另一个事物的坐标空间下  ,既 坐标空间是有层次的

坐标空间的转换,就发生在  点p 在知道A 坐标空间下的表示,需要得出在B空间下的表示

 

这里的 Oc Xc Yc Zc 都是子坐标空间下的点 在 父坐标空间 下的表示

这里的演算,只需要在纸上一画就知道了,比如 Ap 空间下 的 Cc 空间中有一点,Pc(1,1,0),

假设最简单的情况  两个坐标空间完全平行,Oc(2,2,0),则  Xc 的单位向量为 (3,3,0)-(3,2,0)=(1,0,0)

同理 Yc =(0,1,0) Zc=(0,0,1)

我们在图上很容易能看出来点P 在A坐标空间下的位置为(3,3,0) ,我们用上述公式验证一下 和我们已知的是一致的

最后得出来的空间变换矩阵为 

这里也验证了 上面的 推算公式 是正确的

4.6.4 模型空间

模型空间 变换到其它坐标空间,往往需要经过平移变换,所以要把模型坐标空间下的 点 转换为齐次坐标  向量的w 为1

4.6.5 世界空间

4.6.6 观察空间

观察空间 是右手坐标系,z轴的正方向,指向摄像机的后方

4.6.7 裁剪空间

裁剪空间 由  视锥体 决定

裁剪的目的 是为了方便渲染,处于视锥体内的图元被渲染,否则被剔除

所以  视锥体 会有两种,一种是 透视投影的视锥体,一种 正交投影的视锥体

最后的 点 在裁剪空间下的表示(透视投影)

点 是不是在 裁剪空间中的条件 是 

最后的 点 在裁剪空间下的表示(正交投影)

 判断条件 和上面一样

4.6.8 屏幕空间

屏幕空间 是二维坐标系  ,OpenGL 和DirectX 坐标系 略有不同

把裁剪空间中的点 做一次  齐次除法  得到 归一化的设备坐标(NDC  这个以后会经常提及)

齐次除法 就是 x y z 分别除以 w

这个时候得到的 坐标位置 在[-1,1]之间

4.7 法线变换

法线变换 不能使用和 顶点变换 同一个变换矩阵  因为如果遇到非同一缩放,法线变换就会出错误

下面是 求 法线变换矩阵的推导公式

 只有为单位向量 才能满足Ta * Na 为零向量

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity shader 之基础四 数学 的相关文章

  • 记Mysql ES 数据一致性问题及方案

    业务中使用了mysql和ElasticSearch Mysql作为主仓库 ES作为索引 实际上包含了接近全集的数据 问题 Mysql和Es未做事务 出现了并非场景下 A线程从MySql读 写到ES B线程从mysql ES删除 结果是最终E

随机推荐

  • 一种相位编码信号多普勒补偿方法的Matlab仿真

    参考文献 http d wanfangdata com cn periodical hkldjs200901007 在相位编码信号脉冲压缩技术中 存在着多普勒频率敏感性问题 需要对多普勒频率进行补偿 本文在分析多普勒敏感性原因的基础上 提出
  • mybatis foreach Mapped Statements collection does not contain

    id collection就是集合 open 以某种字符开始 close 以某种字符结尾 index 遍历的索引 item 集合中的每一项 separator 以某种字符分隔 在使用foreach的时候最关键的也是最容易出错的就是colle
  • 升级 Node.js 版本的步骤

    node 已经成为前端开发 分不开的工具了 但node的使用除了npm i 等命令 还是有很多不清楚 不常用的 特别是新手 可能经常遇到这样的问题 问题一 明明我的命令是按照前端教的输入的 为什么启动不了我的项目 问题二 我要负责好几个项目
  • route add添加静态路由

    方法一 添加路由 route add net 192 168 0 0 24 gw 192 168 0 1 route add host 192 168 1 1 dev 192 168 0 1 删除路由 route del net 192 1
  • java map获取第一个值_HashMap在Java中怎么工作

    前言 大多数JAVA开发人员都在使用Maps 尤其是HashMaps HashMap是一种简单并且有效的存取数据的方式 但是有多少人知道HashMap内部是如何工作的么 前段时间 为了深入理解这个基础的数据结构 我阅读了 java util
  • 新手小白idea的配置2.1.1讲

    3 IDEA配置 idea的jdk的配置 打开IDEA集成开发环境工具 点击 File Project Structure 如下图 在打开的页面中 选择SDKs属性 并点击中间的加号 选择JDK 如下图 在打开的页面中 选择本地计算机中已经
  • 数据分析理论

    文章目录 一 数据分析的概念 二 数据分析的过程 1 问题定义 2 数据采集 3 数据预处理 4 数据探索和数据可视化 5 预测模型的创建和选择 6 模型评估 7 部署 三 数据分析的作用 一 数据分析的概念 数据分析是指用适当的统计分析方
  • Uniapp 截图或者生成海报的方法

    需求 uniapp移动端需要生成一张当前界面的海报 方案一 类似于手机按钮截图效果 实现代码如下 doSaveScreen let this this uni showLoading 加载框 title 保存中 mask true var
  • STM32F103C8T6详细引脚表

    今天准备画一个STM32F103C8T6的最小系统板 就去STM32F103C8的数据手册查看了一下相应的引脚 因为数据手册里面的引脚表有中容量的多种封装描述 看上去比较麻烦 我就单独做了一个LQFP48脚的引脚表 方便后期自己画封装 就图
  • Spring+Mybatis 查询所有数据时发生异常:org.apache.ibatis.reflection.ReflectionException: There is no getter for

    Spring Mybatis框架整合时 根据条件查询数据 发生异常 Caused by org apache ibatis reflection ReflectionException There is no getter for prop
  • JavaScript分支语句总结

    注 js变量算术运算符和逻辑运算符知识点的补充 1 的区别 表示值相等 表示值相等 数据类型也必须相等 案例 的区别 表示值相等 表示值相等 数据类型也必须相等 var x 10 var y 10 console log x y true
  • 图像降质

    1 逆滤波和维纳滤波 附Matlab完整代码 https blog csdn net weixin 41730407 article details 80455612 2 python 运动模糊 退化模型 点扩散函数 逆滤波与维纳滤波 ht
  • GG-CNN代码学习

    文章目录 1 源码网址 https github com dougsm ggcnn 2 数据集格式转化 下载后的康奈尔数据集 解压完之后里面的格式 里面的 tiff图像通过 txt文件转化得到 python m utils dataset
  • layui 数据表格 sort排序,filter过滤——soulTable

    1 效果图 2 页面代码 div class fp table style margin left 0 5 width 86 table style margin bottom 0px table div 3 js代码 引入扩展组件 lay
  • 【学vue跟玩一样】快速搞懂vue渲染

    Vue的渲染分为条件渲染和列表渲染 那究竟什么式渲染呢 1 条件渲染 1 v if写法 1 v if 表达式 2 v else if 表达式 3 v else 表达式 和我们曾经学过的JavaScript里面的if语句几乎一样 适用于 切换
  • Quartz misfire详解

    一 前言 最近在学习Quartz 看到misfire这一部分 发现官方文档上讲解的很简单 没有看明白 然后去搜索了一下网上的讲解 发现讲的也都大同小异 也没有看明白 最后只能自己动手做测试 总结了一下 这篇文章把自己总结的记录下来 方便自己
  • 使用 HEX 参数在 Python 中实现六边形图像的显示数据关系

    使用 HEX 参数在 Python 中实现六边形图像的显示数据关系 在数据可视化中 六边形图被广泛应用于显示多元数据之间的关系 本文将介绍如何使用 Python 中的 hex 参数来设置六边形图像 并展示如何使用这种方法来显示数据的关系 首
  • Spring Boot —— Security 控制按钮权限

    文章目录 Spring Boot Security 控制按钮权限 前言 实现 引入对应的依赖 配置标签 Spring Boot Security 控制按钮权限 前言 在freemarker中 通过Security根据用户角色控制页面按钮或菜
  • win8.1仅允许运行使用网络级别身份认证的远程桌面计算机连接,使用Win10通过Mstsc远程连接 Server 2012 R2 时出现 身份验证错误,要求的函数不受支持,这可能是由于CredSSP...

    使用Win10通过Mstsc远程连接 Server 2012 R2 时出现 身份验证错误 要求的函数不受支持 这可能是由于CredSSP加密Oracle修正 最终解决方法 原因 因为CVE 2018 0886 的 CredSSP 2018
  • unity shader 之基础四 数学

    4 2 笛卡尔坐标系 笛卡尔坐标系分为二维和三维坐标系 4 2 1二位坐标系 OpenGL 和 DirectX 二位坐标系是不同的 OpenGL 和 DirectX 是不同的图形访问接口 用来和硬件交互的 二维坐标系 是可以相互转换的 既