1.1.1 二维笛卡尔坐标
二维笛卡尔坐标系由x、y轴组成,坐标系的中心为原点(0,0)。
OpenGL与DirectX所用的坐标系起点不同,OpenGL原点在左下角,y轴向上,x轴向右;而DerectX则原点在右下角,y轴向下,x轴向右。
1.1.2 三维笛卡尔坐标
三维笛卡尔坐标系由x、y轴组成,坐标系的中心为原点(0,0,0)。
该三个坐标轴亦被称为坐标系的基矢量。三个坐标轴之间是互相垂直,且长度为1,则被称为标准正交基。而若三个坐标轴之间互相垂直,但长度不为1,则被称为正交基。
而三维坐标轴的坐标方向并不固定,因此分为左手坐标系与右手坐标系。值得一提的是,对于模型空间与世界空间,Unity中所用的为左手坐标系。
而三维坐标之所以要分为左右手坐标系而二维不用,正是因为二维坐标可以通过旋转折叠等方法进行坐标系等价,而三维坐标并不都是等价的,旋转有时并不能使两个不同朝向的坐标系进行重合叠加,如左右手坐标系。
在左手坐标系中,旋转正方形是顺时针;在右手坐标系中,旋转正方形是逆时针。
对于同一次运动,利用不同坐标系进行描述,所用的数学表达式是不一样的。
1.1.3 Unity使用的坐标系
前文提及对于模型空间与世界空间,Unity所使用的坐标系是左手坐标系,在模型空间中,物体的右侧(right)对应x轴,上侧(up)对应y轴,前侧(forward)对应z轴。但对于观察空间来说,Unity所对应的则是右手坐标系,即以摄像机为原点的坐标系。而以摄像机看来,我们所认为的z的负方向实则为为摄像机的正方向,这与模型空间和世界空间中的定义是相反的。随着世界坐标的z轴坐标的减少,即以摄像机的z轴增加,则意味着场景深度的增加。
1.1.4 点和矢量
点是一个位置,可用坐标表示。二维可用(x,y);三维可用(x,y,z)表示。
矢量(也可称为向量),它指的是n维空间中一种包含了模和方向的有向线段。而标量与之不同,标量没方向,仅有距离。
矢量通常用于表示偏移量,它通常用a=(x,y,z)来表示,但与点不同,其(x,y,z)表示的不是坐标值,两点确认一条直线,其x、y、z表示的是头尾两个点的坐标值差的值。(若想再深入了解可重温线性代数)
1.1.5 矢量运算
[1]矢量可以与一个标量进行相乘与相处,所得到的是一个矢量,若两个矢量相乘则得到一个标量(后面再提及,本次提及的是向量与标量相乘),其公式如下:
相乘:v=(x,y,z) 相除:v=(x,y,z)
kv=(kx,ky,kz) (k≠0)
[2]矢量不可以与标量相加减,只能与矢量相加减,其公式如下:
相加:a=(x1,y1,z1) b=(x2,y2,x3) 相减:a=(x1,y1,z1) b=(x2,y2,x3)
c=(x1+x2, y1+y2, z1+z2) c=(x1-x2, y1-y2, z1-z2)
[3]矢量的模
矢量的模是一个标量,若v =(a,b,c),其计算公式如下:
[4]单位矢量
单位矢量指模为1的矢量,在这种情况下,人们只需要关心矢量的方向而不用关心它的长度。其公式如下:
其中v是任意非零矢量,而零矢量(即矢量每个分量值都为0,如v=(0,0,0)),不可以被归一化。
而在后面章节中将会不断遇到法线方向(即法矢量)、光源方向等,这些矢量不一定是归一化后的矢量,而我们所计算的往往要求矢量是单位矢量,从而在使用之前需要对这些矢量进行归一化。(而更多时候如UV贴图等,其坐标轴的范围为(0,1),从而归一化十分重要)
[5]矢量的点积
上文笔记提及到矢量与标量可以相乘,而本点所提及的是矢量与矢量之间的乘法。矢量的乘法有两种最为常用的种类:点积与叉积。
其公式一为:
其公式二为:
而在编写shader的过程中,通常程序接口都会提供这些公式的实现,从而往往开发者不需要手工输入这些公式,如在Unity shader中,开发者可直接使用形如dot(a,b)的代码来对两个矢量值进行点击的运算。
点积运用在图形学各个方面,其中一个几何意义就是计算投影。
[5]矢量的叉积
!叉积不符合交换律,不可以交换,也不符合结合律
利用左右手坐标系,四指旋转方向为a转向b的过程,而拇指为
叉积的作用可以帮助使用者就算垂直于一个面、三角形的矢量以及判断三角面向的朝向等应用。