学习Shader所需的数学基础(坐标系,点和矢量)

数学对于计算机图形学的重要性是不言而喻的。在学习Shader以前,首先就要打好数学基础,好在入门Unity Shader所需的数学知识都是线性代数中很基础的的内容。循序渐进的来,第一篇文章记录总结的是坐标系,点,矢量等概念以及简单的运算。本文主要源自《Unity Shader入门精要》一书的读书笔记。
若是有小伙伴对Shader着色器相关的概念还不了解的话,能够先看下这篇文章一篇文章搞懂到底什么是渲染流水线html

坐标系

在三维笛卡尔坐标系中,咱们须要定义3个坐标轴和一个原点。这3个坐标轴被称为该坐标系的基矢量,相互垂直且长度为1的基矢量被称为标准正交基,相互垂直但长度不为1的基矢量被称为正交基学习

左手坐标系与右手坐标系

咱们能够利用双手来判断一个坐标系的旋向性。请读者举起你的左手,用食指和大拇指摆出一个“L”的手势,而且让你的食指向上,大拇指向右。如今伸出你的中指,它将指向你的前方。此时你已经获得了一个左手坐标系。你的大拇指,食指,中指分别对应了+x,+y,+z轴。以下图所示。
3d

读者能够经过右手获得一个右手坐标系。举起你的右手,此次食指仍然向上,中指指向前方,不一样的是,大拇指将指向左侧。以下图所示。
htm

左手法则与右手法则

左手坐标系和右手坐标系对于正向旋转的定义也不一样,分别取决于左手法则和右手法则。在左手坐标系中,请举起你的左手,握拳,伸出大拇指让它指向旋转轴的正方向,那么旋转的正方向就是剩下4个手指的弯曲方向。在右手坐标系中,使用右手法则对旋转正方向的判断相似。
blog

Unity使用的坐标系

对于模型空间和世界空间,Unity使用的是左手坐标系。
对于观察空间,Unity使用的是右手坐标系。观察空间通俗来说就是以摄像机为原点的坐标系,摄像机的前向是z轴的负方向,也就是说,z轴坐标的减小意味着场景深度的增长。
get

点和矢量

点是n维空间中的一个位置。
矢量是指n维空间中一种包含了模和方向的有向线段。而标量只有模没有方向。
具体来说:数学

  • 矢量的模指的是矢量的长度
  • 矢量的方向则描述了这个矢量在空间中的指向
  • 一个矢量一般由一个箭头来表示。矢量的头就是指它的箭头处,尾指的是另外一个端点处

一般矢量被用于表示相对于某个点的偏移,也就是说只要矢量的模和方向不变,不管放在哪里,都是同一个矢量。it

点和矢量的区别

矢量能够用于表示相对于另外一个点的位置,此时矢量的尾是一个位置,那么矢量的头就能够表示另外一个位置了。若是咱们把矢量的尾固定在坐标系原点,那么这个矢量的表示就和点的表示重合了。尽管点和矢量在数学表达式上都是同样的,但区分点和矢量之间的不一样是很是重要的。能够这样理解,任何一个点均可以表示成一个从原点位置出发的矢量。入门

矢量的运算

矢量和标量乘法/除法

咱们不能把矢量和标量进行相加/相减的运算(想象一下,你会把矢量速度和标量距离相加吗)。
对矢量和标量进行乘法运算,会获得一个不一样长度且可能方向相反的新的矢量。读书笔记

公式

注意:对于乘法来讲,矢量和标量的位置能够互换。但对于除法来讲,只能是矢量除以标量,而不能是标量除以矢量,这是没有意义的。

几何意义

把一个矢量和一个标量相乘,意味着对矢量进行一个大小为标量的缩放。例如,若是想把一个矢量放大两倍,就乘以2,。当标量小于0时,矢量的方向也会相反。

矢量的加法/减法

咱们能够对两个矢量进行相加或相减,其结果是一个相同维度的新矢量
须要注意的是,一个矢量不能够和一个标量相加或相减,也不能和不一样维度的矢量进行运算。

公式

几何意义

在图形学中矢量一般用于描述位置偏移(简称位移)。对于加法,咱们能够把矢量a的头链接到矢量b的尾,而后画一条从a的尾到b的头的矢量,来获得a和b相加的矢量。也就是说,若是咱们从一个起点进行了一个位置偏移a,而后进行了一个位置偏移b,那么就等同于进行了一个a+b的位置偏移。矢量的减法也是相似的。

假设,空间内有两点a和b。咱们能够用矢量a和b来表示它们相对于原点的位移。若是咱们想要计算点b相对于a的位移,就能够经过把b和a相减获得。

矢量的模

矢量的模是一个标量,能够理解为是矢量在空间中的长度。
矢量的表示符号一般是在矢量两旁分别加上一条垂直线

公式

几何意义

从几何意义上来理解二维矢量,咱们能够对任意矢量构建一个三角形,以下图所示。能够看出,其实就是使用了勾股定理,矢量的两个份量的绝对值对应了三角形两个直角边的长度,而斜边的长度就是矢量的模。

单位矢量

在不少状况下,咱们只关心矢量的方向而不是模。在这些状况下,咱们就须要计算单位矢量。
单位矢量指的是模为1的矢量。单位矢量也被称为归一化的矢量。对任何给定的非零矢量,把它转换成单位矢量的过程被称为归一化。

公式

为了求解单位矢量,咱们能够用矢量除以该矢量的模获得。
零矢量(每一个份量都是0的矢量)是不能够被归一化的。这是由于作除法运算时分母不能为0.

几何意义

对于二维空间来讲,咱们能够画一个单位圆(半径为1),那么单位矢量就能够是从圆心出发到圆边界的矢量。在三维空间中,单位矢量就是从一个单位球的球心出发,到达球面的矢量。

矢量的点积

矢量之间也能够进行乘法,矢量的乘法有两种最经常使用的种类:点积(内积)和叉积(外积)。矢量的点积结果是一个标量

公式

公式1,两个三维矢量的点积是把两个矢量分别对应份量相乘后再取和

公式2,矢量的点积等于两个矢量的模乘以cosθ(θ表示两个矢量的夹角)

公式2的推导,以下所示。

重点是为何等于cosθ,以下图所示,红色线段就是|b|*cosθ = cosθ

几何意义

点积的几何意义很重要,由于点积几乎应用到了图形学的各个方面。其中一个几何意义就是投影。
投影是什么意思?加入如今有一个光源,它发出的光线是垂直于单位矢量a方向的,那么矢量b在a方向上的投影就是b在a方向上的影子。

投影结果的正负号与a和b的方向有关:当它们的方向相反(夹角大于90°)时,结果小于0。当它们的方向相同(夹角小于90°)时,结果大于0。当它们互相垂直(夹角为90°)时,结果等于0。这一点利用公式2也能够看出来,结果的正负取决于cosθ。

那么若是a(前面所说的投影都要求a是单位矢量)不是一个单位矢量会如何呢,很简单,任何两个矢量的点积a·b等同于b在a方向上的投影,再乘以a的模。

点积的性质

  • 点积知足交换律,即 a·b = b·a
  • 点积能够结合标量乘法

  • 点积可结合矢量加法/减法

  • 一个矢量和自己进行点积的结果,是该矢量模的平方。这意味着,若是咱们须要比较两个矢量模的大小,能够直接计算两个矢量与自身的点积来进行比较。省去了开平方的操做。
  • 点积的符号可让咱们知道两个矢量的方向关系
  • 利用公式2,能够计算两个矢量之间的夹角

矢量的叉积

与点积不一样的是,矢量叉积的结果还是一个矢量,而非标量。

公式

须要注意的是叉积不知足交换律,可是知足反交换律。即a×b = -(b×a)

几何意义

对两个矢量进行叉积的结果会获得一个同时垂直于这两个矢量的新矢量
叉积最多见的一个应用就是计算获得垂直于一个平面,三角形的矢量。
新矢量的模等于a和b的模的乘积再乘以它们之间夹角的正弦值,计算公式以下:

这和平行四边形的面积计算公式是同样的,即底乘以高,能够认为新矢量的模是两个矢量围成的四边形的面积。

新矢量的方向,就是和两个矢量垂直的方向,但实际上咱们有两个方向能够选择。具体如何选择,须要依据左手坐标系或右手坐标系来判断。
以右手坐标系为例,使用右手法则来判断。先把手心放在a和b的尾的交点处,而后张开手掌让手掌的方向和a的方向重合,再弯曲四指让它们向b的方向靠拢,最后伸出大拇指,大拇指的指向就是a×b的方向。对于左手坐标系使用左手法则来判断也是相似的。

相关文章
相关标签/搜索