向量 Vector

小概念

数学上叫做向量,物理上喜欢称作矢量。

向量的模 Magnitude。

向量的归一化,意味着求单位向量 unit Vector。

向量矩阵

下面是在表示笛卡尔坐标系x-y下的某个向量,可以用矩阵来表示向量。

点乘 Dot

满足交换律、结合律、分配律。

结果是一个数值,可以用来检测2个向量的夹角,<90度为正,90度为0,90~180度为负。

叉乘 Cross

不满足交换律!向量A x 向量B = -向量B x 向量A

结果是一个向量,这个向量是与A、B向量所组成平面的垂直向量,也就是说A、B、C向量构成一个右手直角坐标系。而法线的方向,满足右手螺旋。注意a在前所以a是食指

图形学上,用来检测某个点是否在一个多边形(比如三角形)内。

//因为 向量AB x 向量AP 的结果大于0则说明P在AB左侧,小于0则说明P在AB右侧。

更新=> 首先确定是左手还是右手坐标系。在【右手坐标系】下,如果两个向量的叉乘结果为正值,表示向量AB经过不大于180°的【逆时针】旋转可以与向量AP的方向一致;如果为负,那么就需要转180°到360°(右手法则)。

至于为什么,思考一下a X b = |a|*|b|*sinθ,其中sin的值范围是0°-180°为正,180°-360°为负,就可以知道了。点乘几何意义也是同理,靠cos的值判断的。

所以一个三角面ABC和一个点P,只要通过3次叉乘的结果(都大于0或者都小于0),就能判断出点P在三角面ABC中。这是光栅化的基础,用于着色判断。

矩阵变换:线性变换

关键是,要找出变换前后每一个点之间的变化关系式。矩阵的乘法是不满足交换律的。

缩放 Sacle

可以使用对角阵*向量来进行缩放,这个对角阵叫缩放矩阵。

反射 Reflection

用于翻折的单位矩阵。

切变 Shear

要找出每一个点之间的变化关系式。

比如下图情况,只是水平方向的点发生了变化,竖直方向的不变。水平方向上的每个点发生了a / 1 * y的平移。那么久可以很容易写出切变矩阵。

旋转 Rotate

二维情况下,逆时针旋转θ角:

推导过程(只展示A、C。B、D的话由点0,1可以推出)如下,其实只是展开了点(1,0)的偏移等式。

再进一步探究可知,逆旋转矩阵 = 将原旋转矩阵转置。这意味着想要旋转一个负角度,只要求出正角度的旋转矩阵再转置就可以得到旋转矩阵了。

统称:线性变换

矩阵变换:非线性变换

平移 Translation

平移比较特殊,它不能通过2阶矩阵线性变换(矩阵乘法)得出。因为矩阵乘法你只能得到ax+by的结果,没法出现常数c,所以只能靠加法。

平移解决方案:更高1阶的矩阵

平移必须涉及到同阶矩阵的加法,没法直接用线性变换了。为了在这种情况下也能只使用矩阵乘法就达到变换的目的,可以使用2+1阶的矩阵。多出来的矩阵值,点是1、向量是0。

将二维的点,最后一个矩阵值写为1。如果不是1,那么就看作x => x/w、y => y/w。

那么最后,给出2维 向量、点 的变化矩阵:

逆变换 Inverse

通过使用逆矩阵,可以撤回变换。

组合的矩阵变换

先旋转,后平移。否则会出错,因为矩阵乘法没有交换律!

那么通过矩阵乘法表示线性变换、矩阵平移的时候,就是从右到左一个个乘。

虽然没有交换律,但是有结合律,可以让前面的变换矩阵合成为一个:

分解复杂的矩阵变换

对于一个复杂的矩阵变换(线性变换+平移变换),需要分解为几步,才能通过矩阵乘法来实现。

绕某点旋转

将c移到原点 => 绕原点旋转 => 移回原来

由二维引申到三维

上面讨论的都是二维,转到三维空间,其实也是一样的。

三维缩放、平移

三维旋转

绕某个轴旋转,该轴上的点位置不变。

至于为什么y和x、z轴旋转不一样,详细参考叉乘的右手螺旋定则