Shader入门(4)坐标系和矢量的概念

文中多有引用,如有侵权请指出。

坐标系和矢量的概念

  1. 笛卡尔坐标系

(1) 在三维游戏的实现中,所有的物体和图像都在笛卡尔坐标系的基础上实现。

(2) 二维坐标系和三维坐标系,这些知识在高中时期就已经学过。需要注意的是,在游戏实现中,坐标轴的指向不是一定的,比如二维坐标系的y轴就可以是从下往上,但是也可以是从上往下,三维坐标系中可以是y轴指向上方,也可以是z轴指向上方。每个图形接口,每个引擎,每个坐标空间中的坐标系都有可能是不一样的,这个在以后的工作中需要逐步熟悉。

Shader入门(4)坐标系和矢量的概念

二维笛卡尔坐标系
Shader入门(4)坐标系和矢量的概念

三维笛卡尔坐标系

(3) 左手坐标系和右手坐标系

① 如果两个坐标系可以通过旋转的方式来让它们的每个轴指向都重合,那么这两个坐标系就具有相同的旋向性。这两个坐标系就同属于一个左手或右手坐标系。

② 两个具有不同旋向性的的坐标轴就一定分别属于左手和右手坐标系。要想转换这两个坐标系,只需要把z轴(下图中的right)反向就变成了同一坐标系。
Shader入门(4)坐标系和矢量的概念

③ 这两个坐标系除了坐标轴朝向不同之外,它们对于正向旋转的定义也不相同。要定义旋转的正方向,可以找到初高中学习的左手法则和右手法则。在左手坐标系中,旋转正方向是左手法则定义的,右手坐标系中是右手法则定义的。

④ 需要注意的是,在Unity中,模型空间和世界空间使用左手坐标系,观察空间使用右手坐标系。Unreal 4中,模型空间和世界空间虽然是由Z轴指向上方,但也是左手坐标系。

Shader入门(4)坐标系和矢量的概念

  1. 点和矢量

(1) 点

① 点代表n维空间中的的一个位置,没有大小和宽度的概念。

② 通常可以使用2到3个实数来表示一个点的坐标,比如二维空间中的点P=(Px, Py) ,三维空间中的点P=(Px, Py, Pz) 。

(2) 矢量(vector)

① 矢量的定义是n维空间中的一种包含了模和方向的有向线段。在数学上定义维一系列由线连接的点。

② 矢量的模指的是这个矢量的长度。矢量的长度可以是任意非负数。

③ 矢量的方向描述了这个矢量在空间中的指向。

④ 矢量的表示方法和点相似,如一个三维矢量v可以表示为 v=(x,y,z) 。

⑤ 通常,矢量用于表示相对于某个点的偏移,也就是说它是一个相对量。

Shader入门(4)坐标系和矢量的概念
Shader入门(4)坐标系和矢量的概念

  1. 矢量运算

(1) 矢量和标量的乘法和除法

① 标量事实上就是一个实数。

② 定义一个矢量v和一个标量k,则两者相乘的公式为

Shader入门(4)坐标系和矢量的概念

③ 两者相除的公式为

Shader入门(4)坐标系和矢量的概念

④ -1乘以任意矢量会得到它的相反方向的矢量,0乘以任何矢量都会得到零向量。

(2) 矢量的加减法

① 定义矢量a和矢量b,它们的加减法公式为

Shader入门(4)坐标系和矢量的概念

② 注意:矢量不可以和标量相加或相减,或者是和不同维度的矢量进行运算。

(3) 矢量的模

① 矢量的模代表矢量的长度,是一个标量。

② 矢量的模的表示方法是在矢量两边各加一条竖线。

③ 三维矢量的模的计算公式如下

Shader入门(4)坐标系和矢量的概念

(4) 单位矢量

① 单位矢量指的是模为1的矢量。单位矢量也被称为归一化矢量(normalized vector)。

② 对任何给定的非零矢量,把它转换成单位矢量的过程就被称为归一化(normalization)。

③ 在编写着色器时,很多情况下,我们只关心矢量的方向而不是长度,比如需要得到光源方向,法线方向等信息。因此归一化计算是经常需要用到的。

④ 归一化计算公式如下

Shader入门(4)坐标系和矢量的概念

⑤ 零矢量是不能归一化的。

⑥ 单位矢量的长度都是1,因此,从几何意义上来看,单位矢量就是三维空间中从原点开始到一个半径为1的球的球面的矢量。

⑦ 需要注意的是,矢量的归一化计算和数据的归一化方法是完全不同的。以下是百度归一化方法得到的例子

Shader入门(4)坐标系和矢量的概念

如果以后在运用时忽然记不清矢量归一化计算的公式,而百度看到这个词条之后,就会对归一化产生疑惑:分量中带有负数的矢量进行归一化是否还有意义?所以要强调一下矢量归一化计算和数据处理中的归一化方法的区别。

(5) 矢量的点积

① 矢量和矢量之间的乘法有两种最常用的种类:点积(dot product)(也被称为内积,inner product)和叉积(cross product)。

② 对于两个三维矢量,它们有两个点积的计算公式,公式一如下:

Shader入门(4)坐标系和矢量的概念

③ 点积最重要的一个几何意义就是投影(projection),对于矢量a和矢量b,a*b的结果代表b在a方向上投射的影子的长度。

Shader入门(4)坐标系和矢量的概念

④ 点积运算可以让我们知道两个向量之间的方向关系,当我们要在shader中实现一些特殊效果时,点积运算是非常必要的一种运算。如下,当两个矢量互相垂直时,点积的结果为0,而两个矢量的夹角不断改变时,点积结果也会显示二者的关系。

Shader入门(4)坐标系和矢量的概念

⑤ 点积具有一些很重要的性质

  1. 点积可以结合标量乘法。给定的标量k和给定的两个矢量a和b有如下公式

Shader入门(4)坐标系和矢量的概念

  1. 点积可结合矢量加法和减法。对于给定的三个矢量a、b和c有如下公式

Shader入门(4)坐标系和矢量的概念

  1. 一个矢量和本身进行点积的结果是该矢量的模的平方。对于给定的矢量v,有如下公式

Shader入门(4)坐标系和矢量的概念

⑥ 点积的公式二如下:

Shader入门(4)坐标系和矢量的概念

其中a和b是两个矢量,而θ指的是这两个矢量的夹角。

7通过以上公式可知两个矢量的点积可以表示为两个矢量的模相乘,再乘以它们之间的夹角的余弦值。这两个夹角的余弦值可以直接通过a的模除以b的模得出。

(6) 矢量的叉积

① 矢量的叉积(cross product)也被称为外积(outer product)。

② 叉积的结果仍然是一个矢量,而并非像点积那样称为标量。

③ 对于给定的两个三维矢量a和b,它们的叉积公式如下:

Shader入门(4)坐标系和矢量的概念

④ 需要注意的是,叉积不满足交换律和结合律。而满足于反交换律,即aXb = -(bXa) 。

⑤ 叉积的几何意义是,对两个矢量进行叉积的结果会得到一个同时垂直于这两个矢量的新矢量。

⑥ 叉积的模的计算公式为:

Shader入门(4)坐标系和矢量的概念

⑦ 在左手坐标系中和右手坐标系中得到的叉积方向是不一样的,叉积结果满足右手定则,如果在左手坐标系的话就只需要把结果反向一下就得到了正确的结果。

Shader入门(4)坐标系和矢量的概念

发散思维

  1. UE4中的multiply节点并不是上面两种意义上的矢量的乘法,它只对矢量a和b的每个分量进行分别相乘然后输出。示例:0.4与0.5相乘得0.2;(0.2,-0.4,0.6)与(0.0,2.0,1.0)相乘得(0.0,-0.8,0.6);(0.2,-0.4,0.6)与0.5相乘得(0.1,-0.2,0.3)。

参考图书《Unity Shader入门精要》