Unity Shader入门精要 第4章 点和矢量 读书笔记
4章 学习Shader所需的数学基础-笛卡尔坐标系
注意:图片的来源基本来自作者冯乐乐的GitHub,感谢作者分享
https://github.com/candycat1992/Unity_Shaders_Book
1、点和矢量的区别
点:n维空间中的一个位置,没有大小、宽度这类概念
二维空间的点:
三维空间的点:
矢量(向量):n维空间中一种包含了 模(长度) 和 方向 的有向线段(如:速度)
矢量被用于表示相对于某个点的偏移,也就是说是一个相对量
矢量的表示方法:
1、矢量的模指的是矢量的长度。一个矢量的长度可以是任意的非负数。
2、矢量的方向描述了这个矢量在空间中的指向
矢量通常由一个箭头表示。矢量的头:箭头所在的端,矢量的尾:另一个端处
标量:只有 模(长度) 没有 方向(如:距离)
点 和 矢量 的区别:
点:没有大小之分的空间中的位置
矢量:有模和方向,但是没有位置的量,相对量(可以描述相对位置),如果矢量的头尾都固定在坐标系的原点,则这个矢量就和点重合了。
2、矢量运算
矢量运算的几何意义:
1、矢量和标量的乘法/除法:(注意 这里是矢量与标量的运算)
得到一个不同长度且可能方向相反的新的矢量
矢量被非零标量除,等于矢量和这个变量的倒数相乘(除法 = 倒数的乘法)
注意:乘法的矢量和标量位置可以互换。但是在除法中,只能矢量除以标量,不能标量除以矢量。
从几何意义上看:
乘法:对 矢量v 进行一个大小为 |k| 的缩放
1、矢量乘以2:放大2倍
2、当k < 0 时,矢量的方向也会取反
2、矢量之间的加法和减法:(注意 这里是矢量与矢量的运算)
对两个矢量进行相加或相减,得到一个相同维度的新矢量
把两个矢量的对应分量进行相加或者相减即可
注意:
1、矢量 不可以和 标量 相加或者相减
2、矢量 不可以和 不同维度的矢量进行运算
从几何意义上看:
在图形学中,矢量通常用于描述位置偏移(位移)。
利用矢量的加法和减法可以计算一个点相对于另一个点的位移。
矢量的三角形定则:
加法:从一个起点开始进行了两次位置偏移:位置偏移a,然后再位置偏移b,就等同于进行了一个 a+b的位置偏移。
减法:用矢量 a 和 b 表示相对于原点的位移,如果想要得到计算点a 相对于 点b 的位移,把 b 和 a 相减得到。
3、矢量的模:
模是一个标量,矢量在空间中的长度。
二维矢量:勾股定理 a²+b²=c²
三维矢量的模的计算公式:
几何意义上:对任意矢量构建一个三角形
4、单位矢量(被归一化的模为1的矢量):只关心矢量的方向,不关心矢量的模(长度)
光照模型:需要得到顶点的法线方向和光源方向,不关心矢量有多长,计算单位矢量即可。
对任何给定的非零矢量,把这个矢量转换成单位矢量的过程就被称为 归一化。
给定任意非零矢量v,可以计算和v方向相同的单位矢量。
对矢量进行归一化:矢量除以矢量的模
零矢量:矢量的每个分量值都为0,如
零矢量不可以被归一化(做除法运算时分母不能为0)
几何意义:
二维空间:单位圆,单位矢量从圆心出发,到圆边界的矢量
三维空间:单位矢量就是从一个单位球的球心出发、到达球面的矢量
矢量的乘法:点积(内积) 叉积(外积)
5、矢量的点积:(几何意义 投影)
点积:dot(a,b)
点积公式一:两个三维矢量的点积是把两个矢量对应分量相乘后再去和,最后的结果是一个标量。
点乘的点积满足交换律:
假如有一个单位矢量 a 和 另一个长度不限的矢量b,如果希望得到 b 在平行于 a 的一条直线上的投影。点积 a·b 得到 b 在 a 方向上的有符号的投影。
点积的结果可以得到两个矢量的方向关系:
注意:投影的值可能是负数,投影结果的正负号与 a 和 b 的方向有关:
1、当它们的方向相反(夹角大于90°)时,点积结果小于0
2、当它们的方向互相垂直(夹角为90°)时,点积结果等于0
3、当它们的方向相同(夹角小于90°)时,点积结果大于0
如果 a 不是 单位矢量,则任何两个矢量的点积 a·b 等同于 b在a方向上的投影值,再乘以a的长度。
点积性质一:对点积中其中一个矢量进行缩放的结果,相当于最后的点积结果进行缩放
点积的操作数之一可以是另一个运算的结果,矢量和标量相乘的结果:
点积性质二:点积可结合矢量加法和减法
点积的操作数可以是矢量相加或者相减后的结果
点积性质三:一个矢量和本身进行点积的结果,是该矢量的模的平方
点积公式一:
可以直接利用点积去求矢量的模(对点积结果进行开平方的操作才能得到真正的模)。注意:开平方的运算需要消耗一定的性能,如果只是想要比较两个矢量的大小,可以直接使用点积的结果比较大小,不需要专门开平方。
点积公式二:
两个矢量的点积可以表示为两个矢量的模相乘,再乘以它们之间夹角的余弦值。
求得两个向量之间的夹角(在0°~180°):
6、矢量的叉积(外积)
矢量的叉积的结果是一个矢量
三维矢量叉积的计算规律:不同颜色的线表示了计算结果矢量中对应颜色的分量的计算路径。以红色为例,即结果矢量的第一个分量,它是从第一个矢量的y分量出发乘以第二个矢量的z分量,再减去第一个矢量的z分量和第二矢量的y分量的乘积
注意:叉乘不满足交换律和结合律
但是,叉乘满足 反交换律:
叉积的几何意义:对两个矢量进行叉积的结果会得到一个同时垂直于这两个矢量的新矢量。
a×b的长度等于 a 和 b 的模的乘积再乘以它们之间夹角的正弦值(点积用的是 cos)
平行四边形的面积公式:底乘以高(|b|h)
如果a和b平行(方向完全相同或者相反),那么构建的平行四边形面积为0,即 a×b=0(零向量)
分别使用左手坐标系和右手坐标系得到的叉积结果:在右手坐标系中,a×b的方向将使用右手法则判断。注意:使用左手坐标系还是右手坐标系不会对计算结果产生任何影响,影响的只是数字在三维空间中的视觉表现而已(比如会造成渲染的图片相反)。
叉积的应用:计算垂直于一个平面、三角形的矢量。用于判断三角面片是正面还是背面。
如何判断一个三角面片是正面还是背面:
利用叉积,判断三角形的三个顶点(p1,p2,p3)在当前空间中是顺时针还是逆时针。
1、左手坐标系,
2、p1,p2,p3都位于xy平面(z分量为0),
3、人眼位于z轴负方向向z轴正方向观察
令 u = p2 - p1,v = p3 - p1。因为三个点都位于xy平面,那么有:
矢量的叉积为:
通过判断
的符号来判断三角形的朝向,
1、如果这个值为负(叉积结果为负),则由左手法则判断可以得到3个顶点的顺序是 顺时针方向,
2、如果这个值为正(叉积结果为正),则由左手法则判断可以得到3个顶点的顺序是 逆时针方向。