找回密码
 立即注册
查看: 365|回复: 0

《UnityShader入门精要》学习笔记——第四章(上):学习 ...

[复制链接]
发表于 2022-1-5 18:58 | 显示全部楼层 |阅读模式
声明

本文章的学习内容来源全部出自《UnityShader入门精要》——冯乐乐
该文章只是本人我的学习笔记,里面对《UnityShader入门精要》进行了些许概括且加了自己的些许理解
如果想更加具体地了解其内容,建议购买原著进行学习
<hr/>4.2笛卡尔坐标系

4.2.1二维笛卡尔坐标系



二维笛卡尔坐标系包含两部分信息:

  • 一个特殊的位置,即原点,它是整个坐标系的中心
  • 两条过原点的互相垂直的矢量,即x轴和y轴。这些坐标轴也被称为是该坐标系的基矢量
x,y轴不一定是图4.3中的指向,如OpenGL DirectX 使用了不同的二维笛卡儿坐标系


4.2.2三维笛卡尔坐标系



3个坐标轴称为该坐标系的基矢量
正交基:坐标系的坐标轴相互垂直
标准正交基:坐标系的坐标系相互垂直且长度为1
(如没特殊说明,接下来默认情况下使用的坐标轴值的都是标准正交基

4.2.3 左手坐标系 和 右手坐标系

从某种意义上来说,所有的二维笛卡尔坐标系都是等价的(可以通过旋转和翻转实现重合)
三维笛卡尔坐标系分为:左手坐标系、右手坐标系
这2个坐标系旋向性不同

判断左右坐标系的方法一:
拿出手,大拇指指向+x,食指指向+y
左手坐标系:左手中指能指向+z
右手坐标系:右手中指能指向+z


判断左右坐标系的方法二:
拿出手,大拇指指向+z,4指指向+x
弯曲4指,哪只手的4指能逐渐弯曲至+y,则是哪手坐标系
旋转正方向的确定:哪手坐标系,就用哪之手,大拇指指向旋转轴正方向,4指弯的方向就是旋转正方向
如下图,左手坐标系的旋转正方向是顺时针右手坐标系的旋转正方向是逆时针


在不同坐标系下移动旋转的案例:



接下来注意术语:”坐标“,”位置
不同坐标系的同一个坐标,对应不同的位置,但是旋转相同角度,得到的坐标相同,如:
在左手坐标系中,一个点 旋转  角度后,得到
同样在右手坐标系,一个点 旋转  角度后,也会得到
但是这只是对各自坐标系而言的,实际上如果放在同一个坐标系下来看, 不在同一个位置, 可能在同一个位置



起始点(0,0,1),绕+y旋转90°

左手坐标系的点想要和右手坐标系的点位置重合,就需要将一个值取反,如:
左手坐标系 和右手坐标系  、  、 重合,(注意:这里的坐标系是可以自由旋转的,不然怎么可能 既和 重合,又和  重合呢)



起始点(0,0,1),绕+y旋转90°

2个坐标系转换:其实只要将坐标系的某一个轴反向,就变成了另一个坐标系

4.2.4 Unity使用的坐标系

1.模型空间、世界空间——左手坐标系


2.观察空间——右手坐标系
观察空间:以摄像机为原点,摄像机的后方为+z,镜头(可以理解为你电脑屏幕)右方是+x,上方为+y



补充:3dmax、blender世界空间都是右手坐标系,所以模型导出fbx到Unity前要进行变换



Blender的世界空间坐标系(右手坐标系)

<hr/>4.3点和矢量

点(point)只有位置的概念,无大小
矢量(verctor,向量),有大小和方向
标量(scalar),只有大小

矢量被用于表示相对于某点的偏移量
矢量的头:箭头的位置 ;矢量的尾:向量的起始点

不同量的表示方法:

  • 标量的表示:用小写字母表示,如a,b,c
  • 矢量的表示:用粗体小写字母表示,如  ,  ,
  • 矩阵的表示:用粗体大写字母表示,如  ,  ,

4.3.1 点和矢量的区别

任何一个都是从原点出发的矢量



4.3.2矢量运算

1.向量和标量乘法/除法



注意:对于乘法,向量和标量的位置可以互换;对于除法,只能向量被标量除

2.向量的加法和减法



注意:向量不能和标量相加减,或者说不能和不同维度的向量运算
几何意义:在图形学中常用于表述位置偏移(简称位移)


位移的理解:

可以表示相对于原点的位移; 表示点 b 相对于点 a 的位移

3.向量的模(向量的长度)




4.单位向量(归一化向量)

模长为1的向量,用 表示
向量的归一化    ;(  是任意非零向量)
三维空间中,单位向量从一个单位球的球心出发,到达球面
在很多情况下,我们只关心向量的方向,例如,在计算光照模型时,我们需要得到的顶点的法线方向和光源方向,此时就需要进行向量的归一化

零向量

,每个分量都为0,无法进行归一化

5.向量的点积(dot)

2个向量点积的结果为标量
公式一
性质:

  • 交换律
  • 结合标量乘法  
  • 分配律  
  • 向量点积自己,为自己模的平方   
公式二
其中:



可以理解为  在  方向上的投影(有正负)



6.向量的叉积(外积)(cross)

向量叉积的结果还是向量








(所以当  和  平行时,
几何性质:



性质:

  • 反交换律
  • 不满足结合律   
  • ,   (注意是 ,而不是标量0)

叉积后的方向判断

,即叉积后的结果垂直于  和  构成的平面
右手坐标系:右手的4指指向  ,然后绕向  ,大拇指的方向就是  的方向
左手坐标系用左手


(不论是哪个坐标系,叉积后的数学表达结果是一样的,只是表现的视觉效果不同)

补充叉积的矩阵表示(中间的是矩阵行列式,右边的是矩阵)



叉积的应用:
1.通过叉积判断左右
如左图,改图为 平面, 的方向朝向纸外(右手坐标系)
当  的z方向为正时,则说明  在  的左侧,反之则在右侧



图片来源:Games101

2.通过叉积判断内外
如右图点  ,当 的方向相同时,则说明  在三角形 内部
(这其实是后来的光栅化基础,因为需要判断像素是否在三角形内)
<hr/> 4.4矩阵

4.4.1 矩阵的定义

行(row),列(column)
3行x4列矩阵:



表示这个元素在矩阵  的第 行、第

4.4.2 和向量联系起来

向量  可以用行矩阵(行向量)列矩阵(列向量)表示
行矩阵(行向量)
列矩阵(列向量)
4.4.3 矩阵运算

1. 矩阵和标量的乘法

矩阵的每个元素和标量相乘



2.矩阵和矩阵的乘法

第一个矩阵的列数必须等于第二个矩阵的行数,它们相乘结果得到的矩阵的行数和第一个一样,列数和第二个一样
即, 的矩阵  和 的矩阵  相乘,结果 为  的矩阵

具体表达式,设

如下图


性质:

  • 不满足交换律  
  • 结合律
4.4.4 特殊的矩阵

1.方块矩阵(square matrix)


的矩阵

对角矩阵(diagonal elements)
方块矩阵除了对角外的所有元素都为0
如:

2.单位矩阵(indentity matrix)

对角的元素全为1的对角矩阵


单位矩阵和标量数字1一样



3.转置矩阵(transposed matrix)

把原来矩阵翻转,行列对调

的矩阵 转置成 的矩阵


例如:


行矩阵的转置为列矩阵列矩阵的转置为行矩阵





性质:

  • 矩阵转置的转置等于原矩阵
  • 矩阵串接(相乘)的转置,等于方向串接(相乘)各个矩阵的转置  


4.逆矩阵(inverse matrix )

只有方阵才能有逆矩阵,不是所有方阵都有逆矩阵
给定一个方阵  , 它的逆矩阵为  
最重要的性质:
方阵和它的逆矩阵相乘为单位矩阵,即  

如果一个矩阵有逆矩阵,则这个矩阵可逆(invertible)或者说是非奇异的(nonsingular)
如果一个矩阵无逆矩阵,则这个矩阵不可逆(noninvertible)或者说是奇异的(singular)

逆矩阵的性质:

  • 逆矩阵的逆矩阵是原矩阵本身,即
  • 单位矩阵的逆矩阵是它本身,即   
  • 转置矩阵的逆矩阵 是 逆矩阵的转置,即
  • 矩阵串接相乘后的逆矩阵等于反向串接各个逆矩阵(前提是各个矩阵都可逆)

逆矩阵的几何意义:逆矩阵允许我们还原这个变换,或者说计算这个变换的反向变换
我们使用变换矩阵  对向量  进行一次变换,然后再用它的逆矩阵  进行另一次变换,那就会得到原来的向量



通过行列式(determinant)判断矩阵可逆
如果一个矩阵的行列式不为0,则它就是可逆的
3阶矩阵行列式求法:
法一,对角线公式法:





法二:代数余子式,按任一行或列展开:


前面的系数的正负号通过下表来判断,即   ,所以是

5.正交矩阵(orthogonal matrix)

如果一个矩阵的转置==该矩阵的逆矩阵,那么这个矩阵是正交的,这个矩阵叫做正交矩阵
或者说  

根据定义,一个3x3的正交矩阵






可以写成向量形式 ,即 ,注意这里的向量都是3维的,所以  还是3x3的矩阵;符号” “表示按行展开向量,符号”|“表示按列展开向量






所以我们得到9个等式:


重点:所以一个矩阵是正交矩阵的条件

  • 矩阵的每一行,即  都是单位向量,这样它们点积自身结果才为1
  • 矩阵的每一行,即  之间相互垂直,这样它们点积对方结果才为0
  • 上述的结论对每一列也都适用,因为  是正交矩阵的话,则 也是正交矩阵

笛卡尔三维坐标系的标准正交基(基矢量长度为1,相互垂直),所组成的矩阵就是一个正交矩阵
我们常构造正交矩阵,因为正交矩阵可以通过求 转置矩阵 快速得到 逆矩阵

4.4.5 行矩阵还是列矩阵(Unity选择向量成为列矩阵)

选择行矩阵还是列矩阵,这关系到矩阵之前乘法的次序和结果
在Unity中,常把向量放在矩阵的右侧,即把向量转为列矩阵来进行计算。这意味着,矩阵的乘法通常都是右乘(从右往左乘)


上面的计算等价于下面的行矩阵计算,即将矩阵转置后计算


<hr/>另外参考资料:Games101
再次声明

本文章的学习内容来源全部出自《UnityShader入门精要》——冯乐乐
该文章只是本人我的学习笔记,里面对《UnityShader入门精要》进行了些许概括且加了自己的些许理解
如果想更加具体地了解其内容,建议购买原著进行学习

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-23 00:41 , Processed in 0.069204 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表