|
声明:
本文章的学习内容来源全部出自《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入门精要》进行了些许概括且加了自己的些许理解
如果想更加具体地了解其内容,建议购买原著进行学习 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|