计算机图形学之所以深奥难懂,很大原因在于它是建立在虚拟世界上的数学模型。数学渗透到图形学方方面面,当然也包括shader,我们写shader最常使用的就是矢量和矩阵(线性代数)。但很多情况下我们需要打交道的只是一些基础的数学运算,只要掌握了这些内容,就发现很多事情可以迎刃而解。
一、左手坐标系和右手坐标系
在三维笛卡尔坐标系中要区分左手坐标系和右手坐标系,如果两个坐标系具有相同的旋向性,那么就可以通过旋转的方法来让它们的坐标轴指向重合。但是如果具有不同的旋向性(例如坐标系A属于左手坐标系,B属于右手坐标系,那么就无法达到重合的目的)。
我们可以利用我们的双手来判断一个坐标系的旋向性,举起自己的左手,用食指和大拇指摆出一个“L”的手势,并让自己的食指指向上,大拇指指向右,现在伸出中指,应该是指向自己的前方,现在已经得到了一个左手坐标系,手指分别对应了+x,+y和+z轴的方向。
同样可以通过右手来得到一个右手坐标系,举起右手,这次仍然食指指向上,中指指向前方,不同的是大拇指将指向左侧。
另外一个确定左手坐标系和右手坐标系的方法是,判断前向的方向。让自己坐直,伸出右手,此时右手的方向就是x轴正向,而你头顶上的方向就是y轴正向。这时如果你的正前方的方向是z轴正向,那么你本身所在的坐标系就是一个左手坐标系,如果你的正前方对应的是z轴负向,那么就是一个右手坐标系。
除了坐标轴朝向不同之外,左手坐标系和右手坐标系对于正向旋转的定义也不同,即在初高中物理中学到的左手法则和右手法则。在左手坐标系中,可以这样应用左手法则:举起自己的左手,握拳,伸出大拇指让自己指向旋转轴的正方向,那么旋转的正方向就是剩下4个手指弯曲方向,在右手坐标系中,使用右手法则对旋转正方向判断类似。在左手坐标系中,旋转正方向是顺时针的,而在右手坐标系中,旋转正方向是逆时针的。
二、unity使用的坐标系
在unity中,模型空间和世界空间unity使用的是左手坐标系,这可以从scene视图的坐标轴显示看出来,如下图所示:
但对于观察空间来说,unity使用的是右手坐标系。观察空间通俗来讲就是以摄像机为原点的坐标系。在这个坐标系中,摄像机的前方是z轴负方向,这与在模型空间和世界空间中的定义相反,也就是说z轴坐标的减少意味着场景深度的增加。如下图所示:
三、点和矢量
点是n维空间的一个位置,他没有大小、宽度这类概念。矢量是n维空间中一种包含了模和反向的有向线段。速度就是一种典型的矢量。
3.1单位矢量
在很多情况下我们只关心矢量的方向而不是模。例如在计算光照模型时,我们往往需要得到顶点的法线反向和光源方向,此时我们不关心这些矢量有多长。这种情况下就需要计算单位矢量。
单位矢量指的是那些模为1的矢量。单位矢量也被称为被归一化的矢量。对任何给定的非零矢量,把他转换成单位矢量的过程就被称为归一化。