Unity——数学基础

近期在做Unity项目,遇到一个问题需要涉及到Unity Shader方面,所以需要重新学习一下这方面的知识,打好数学基础对Unity真的很关键!

1,坐标系

Unity中一切都建立在坐标系上,坐标系没搞清楚一定搞不清楚Unity。Unity大体上为左手坐标系,即x轴在物体右手边,y轴在物体上方,z轴在物体前方。

Unity中的坐标系

不过从观察角度,即摄像机为原点来说,为右手坐标系,并且摄像机的前方为z轴的负方向,即x在物体的右手边,y轴在物体的上方,z轴在物体的后方。

Unity中镜头的坐标系

2,矢量

矢量是一种包括模(magnitude)和方向(direction)的有向线段,他的头为目的地,尾为出发点。

矢量与标量的乘除法直接对矢量的每个分量进行乘除即可。

矢量间的加减法直接将对应的每一项分量进行加减即可。

矢量的模表示了矢量的长度。

模长计算方法

单位矢量是模为1的矢量,用于表示方向,任何向量的方向都可以用对应的单位向量来表示。


某向量的单位向量计算方法,零向量为矢量为零的向量

矢量的点积又称为矢量的内积,点积的符号是“·”,结果是一个标量,运算方法是对位相乘和|a||b|cosθ。它的几何意义为投影,如果两矢量为同向,则投影为正,垂直为0,相反为负。

点积遵循结合律,分配律,矢量与本身的乘积等于矢量模的平方.

矢量的叉积又称为矢量的外积,叉积的符号是“x”,结果是一个矢量,运算方法为|a||b|sinθ,和如下:

axb = ( aybz – azby , azbx – axbz , axby – aybx ),即主对角线相加减副对角线相加

叉乘不满足交换律,即axb!=bxa。

axb的方向左手坐标系,为a为x轴,b为z轴时y轴所指方向。

3,矩阵

矩阵为网格结构,有行有列:

矩阵

矩阵和标量的乘除法直接将矩阵每个元素做相对应的运算即可。

Unity中,通常把矢量转换成列矩阵来计算,把矢量放在矩阵右边来计算,即右乘。

矩阵间的乘除只有满足第一个矩阵的列数必须和第二个矩阵的行数相同才可以进行,结果的矩阵的行数为第一个矩阵的行数,列数为第二个矩阵的列数。即A(XxY)xB(YxZ)=C(XxZ)。

矩阵的乘除法需要逐项运算,即选中左边的行,右边的列,行的第i个和列的第i个逐项相乘再相加,以下图为例:

为计算C23这一项,需要将A的第二行,B的第三列对应相乘相加,即A₂₁*B₁₃+A₂₂*B₂₃。要计算C42即要将A的第四行,B的第二行对应相乘相加,即A₄₁*B₁₂+A₄₂*B₂₂

矩阵的乘除不满足交换律,但是满足结合律。

特殊的矩阵:

  • 方块矩阵
  • 指行列相等的矩阵,在三维渲染中经常使用的有3×3,4×4方阵。
  • 单位矩阵
  • 主对角线全为1的矩阵,用In表示,它与任何矩阵相乘的结果都不变,即AI=IA=A
  • 转置矩阵
  • 表示为Mᵀ,是将行变成列,列变成行的操作
  • 矩阵的转置的转置等于矩阵本身,矩阵相乘的转置等于反向相乘各个矩阵的转置,即(AB)ᵀ=BᵀAᵀ
  • 逆矩阵
  • 只有方阵才有逆矩阵,方阵M的逆矩阵表示为M⁻¹,逆矩阵和原矩阵相乘所得的结果一定是一个单位矩阵,即M⁻¹M=I。但不是所有矩阵都有单位矩阵,例如零矩阵。
  • 如果一个矩阵有逆矩阵,则该矩阵可逆,非奇艺,否则不可逆,奇异。判断一个矩阵是否可逆,可以通过判断其行列式是否为0,如果不为0则可逆。
  • 逆矩阵的逆矩阵是原矩阵本身。
  • 单位矩阵的逆矩阵是原矩阵本身。
  • 转置矩阵的逆矩阵是逆矩阵的转置,(Mᵀ)⁻¹=(M⁻¹)ᵀ。
  • 矩阵相乘的逆矩阵等于反向相乘各个逆矩阵,(AB)ᵀ=BᵀAᵀ。
  • 正交矩阵
  • 矩阵和它的转置矩阵相乘为单位矩阵,则为正交矩阵。
  • 正交矩阵的逆矩阵和转置矩阵相同
  • 矩阵的每一行,a1,a2,a3都是单位矢量,并且他们之间相互垂直
  • 正交基:基矢量之间互相垂直。标准正交基:正交基的基矢量长度均为1

4,矩阵的几何意义

矩阵的几何意义在于变换,指的是把数据通过某种方式转换。

线性变换是一种变换,它的变换满足矢量和的变换等于矢量变换的和,矢量变换和标量的积等于矢量与标量的积的变换,如下图所示。

满足上式子的称为线性变换,是变换的一种,可见缩放,旋转都是一种线性变换,除此之外,错切,镜像,正交投影都是线性变换。

仿射变换是一种包含了线性变换和平移变换(不是线性变换,不满足矢量和)的变换类型,可以用4×4的矩阵表示,该矩阵所在的四维空间称为齐次坐标空间。


三位矢量转换成齐次坐标(四维矢量),对于点,w设为1,对于线,w设为0。

下面列出三种矩阵:

平移矩阵,平移的单位为(tx,ty,tz),平移矩阵不是一个正交矩阵。
缩放矩阵,如果缩放系数kx=ky=kz,则为同一缩放,即等比例缩放,缩放矩阵一般不是正交矩阵。

旋转矩阵是正交矩阵,并且多个旋转矩阵的乘积也是正交的。

复合矩阵约定的变化顺序是先缩放,再旋转,最后平移,因为使用的是列矩阵,所以矩阵表达式的阅读方法是从右到左。

不同的变换顺序会导致结果不同,所以需要按照约定的复合矩阵变化顺序来做。

复合旋转函数比较复杂,有两种旋转方式:按世界坐标系旋转(zxy),按物体坐标系旋转(yxz)。Unity中一般按照世界坐标系,即zxy顺序旋转。

将子坐标中的某点(a,b,c)表示在父坐标中,需要知道子坐标的三个坐标轴在父坐标中表示为xₐ,yₐ ,zₐ ,和子坐标原点在父坐标中的位置Oₐ 

左边矩阵则为变换矩阵,变换矩阵的转置矩阵则为从父坐标到子坐标的变换矩阵。