Unity Shader入门精要 笔记三(基础篇--学习Shader所需的数学基础)

1 笛卡尔坐标系

1.1 二维笛卡尔坐标系

一个二维笛卡尔坐标系包含了两部分信息:

  • 一个特殊的位置,即原点,他是整个坐标系的中心。
  • 两条过原点的互相垂直的矢量,即x轴和y轴,这些坐标轴也被称为是该坐标系的基矢量。
    二维笛卡尔坐标系

这里,Unity WorldToScreenPoint默认左下角为原点。

1.2 三维笛卡尔坐标系

对于二维笛卡尔坐标系,例如上面OpenGL和DirectX两个坐标系,进行翻转操作后,坐标轴的指向就完全相同了,从这种意义上来说,所有的二维笛卡尔坐标系都是等价的。

但是对于三维笛卡尔,会更复杂一点,和二维一样,它的坐标轴方向也是不固定的,但是,靠旋转有时并不能是两个不同朝向的坐标系重合,也就有了两种不同种类的坐标系:左手坐标系和右手坐标系。
左手坐标系、右手坐标系
除了坐标轴朝向不同之外,左手坐标系和右手坐标系对于正向旋转的定义也不同,即在初高中物理中学到的左手法则(left-hand rule)右手法则(right-hand rule)

在左手坐标系中,举起左手,握拳,伸出大拇指,让它指向旋转轴的正方向,那么旋转的正方向就是剩下4个手指的弯曲方向。右手坐标系,使用右手法则对旋转正方向的判断类似。

左手法则&右手法则

1.3 Unity使用的坐标系

对于模型空间和世界空间,Unity使用的是左手坐标系,这可以从Scene视图的坐标轴显示看出来。
Scene视图
但对于观察空间来说,Unity使用的是右手坐标系。观察空间,就是以摄像机为原点的坐标系,在这个坐标系中,摄像机的前向是z轴的负方向,这与在模型空间和世界空间中的定义相反。

2 点和矢量

2.1 点

点(Point)是n维空间中的一个位置,它没有大小、宽度这类概念。

2.2 矢量

矢量(vector),也被称为向量,矢量是指n维空间中一种包含了模(magnitude)和方向(direction)的有向线段,例如速度。而标量只有模没有方向,例如距离。

  • 矢量的模指的是这个矢量的长度,可以使任意非负数。
  • 矢量的方向则描述了这个矢量在空间中的指向。

矢量通常被用于表示相对于某个点的偏移(displacenment),也就是说它是一个相对量,只要矢量的模和方向保持不变,无论放在哪里都是用一个矢量。

2.3 矢量运算

2.3.1 矢量和标量的乘法/除法

标量是没有方向的,所以不能与矢量相加减,但可以进行乘法运算,结果会得到一个长度不同,方向相同或者相反的新的矢量。

公式: kv = (kvx, kvy, kvz)

在这里插入图片描述

2.3.2 矢量的加法/减法

a + b = (ax+bx, ay+by, az+bz)
a - b = (ax-bx, ay-by, az-bz)

在这里插入图片描述

2.3.3 矢量的模

v∣ = √(vx2+vy2+vz2)

2.3.4 单位矢量

单位矢量是指模为1的矢量,也被称为归一化的矢量(normalized vector),对任何给定的非零矢量,转化成单位矢量的过程叫做归一化(normalization),零矢量是不能被归一化的。

v的单位矢量 = v/∣v∣。

2.3.5 矢量的乘法

矢量的乘法有两种常用的种类:

  • 点积(dot product),也被称为内积(inner product);
  • 叉积(cross product),也被称为外积(outer product)。

对比:

名称标积/内积/数量积/点积矢积/外积/向量积/叉积
运算式(a,b和c粗体字,表示向量)运算式(a,b和c粗体字,表示向量)a×b=c,其中|c|=|a|b|·sinθ,c的方向遵守右手定则
几何意义向量a在向量b方向上的投影与向量b的模的乘积c是垂直a、b所在平面,且以|b|·sinθ为高、|a|为底的平行四边形的面积
运算结果的区别标量(常用于物理)/数量(常用于数学)矢量(常用于物理)/向量(常用于数学)
2.3.5.1 点积

点积的几何意义:
投影(projection),一个单位矢量a和一个长度与不限的矢量b的点积,就是矢量ba方向上的有符号的投影。

点积的计算公式:
(1)a·b = (ax, ayaz)·(bx, bybz) = axbx+ayby+azbz
(2)a·b = |a||b|cosθ

点积的性质:

  • 点积可结合标量乘法:(kab = a·(kb) = k(a·b)
  • 点积可结合适量的加减法:a·(b+c) = a·b+a·c
  • 一个矢量和本身进行点积的结果是该矢量模的平方
2.3.5.2 叉积

叉积的几何意义:
(1)计算平行六面体的体积

体积
向量H是垂直于底面的向量,|H|是六面体的高,可看作向量A在H方向上的分量,分量可以用点积表示,这在上一篇中叙述过。如果令u是H方向的单位向量:

体积

(2)判断点是否在同一个平面
空间内的三点可以确定一个平面,P1,P2,P3是空间中的三个点,另有一点P,如何判断P是否在平面内?

问题
可以借助向量通过上一节中平行六面体体积的知识判断,如下图所示:

图
这样形成了三个向量,|P1P3×P1P2| 是这两个向量围成的平行四边形的面积,P1P·|P1P3×P1P2| 表示平行六面体的体积,如果体积是0,那么P就在平面内。

(3)计算法向量
也可以用另一种方法求解上面的问题,这需要法向量的帮助。一个与平面垂直的向量称为该平面的法向量,一个平面有无数条法向量,法向量与一个常数的乘积还是法向量。

法线
N是平面的法向量,如果N⊥P1P,则P在平面内。根据点积的知识,N·P1P = 0,则N⊥P1P。如何计算N呢?实际上,N就是P1P3与P1P2的叉积。

如果P在平面内,则体积 = P1P·(P1P3×P1P2)= 0;由于N⊥P1P,N·P1P = 0,结合二者:

P1P·(P1P3×P1P2)= P1P· N = 0

=> N = P1P3×P1P2

叉积的计算公式:
a×b = (ax, ay, az)×(bx, by, bz) = (aybz-azby, azbx-axbz, azby-aybx)

叉积的性质:

  • 结果是一个矢量,遵循右手法则。

右手法则

  • 不满足交换律和结合律
    a×b = -(b×a)
    (a×bca×(b×c)

3、矩阵

3.1 矩阵的定义

矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。
由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵。这m×n 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数 aij为(i,j)元的矩阵可记为(aij)或(aij)m × n,m×n矩阵A也记作Amn
元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵。而行数与列数都等于n的矩阵称为n阶矩阵或n阶方阵。

3.2 矩阵和矢量

矢量是一个数组,二矩阵也是一个数组,我们用矩阵表示矢量,则矢量可看成是1×n的行矩阵(row matrix)或者n×1的列矩阵(column matrix)。

3.3 矩阵的运算

3.3.1 加法

在这里插入图片描述矩阵的加法满足下列运算律(A,B,C都是同型矩阵,只有同型矩阵之间才可以进行加法):
A+B = B+A
(A+B)+C = A+(B+C)

3.3.2 减法

减法和加法一样:
在这里插入图片描述

3.3.3 数乘

在这里插入图片描述
矩阵的数乘满足以下运算律:
λ(μA) = μ(λA)
λ(μA) = (λμ)A
(λ+μ)A = λA+μA
λ(A+B) = λA+λB

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

末零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值