zl程序教程

您现在的位置是:首页 >  其它

当前栏目

图形中的线性代数

图形 线性代数
2023-06-13 09:13:58 时间

概要

本篇介绍下图形学中涉及的线性代数,通过本篇的学习,可以为后续学习图形的各种变换打下坚实的基础。为了避免单纯介绍数学带来的抽象,本篇会以图形的方式来解释数学。那现在就开始吧。

向量

点乘是一个降维操作,结果是一个数值,可以计算两个方向的相似性,在前面计算光线追踪的漫反射和高光的时候提到过。

image.png

image.png

上面的2个公式就是点乘的解释。不知道是否有过疑问,为什么对应坐标的乘积和就等于两个向量的范数乘积再乘以夹角余铉呢? 我简单写了下推导过程,如下所示:

点乘证明

叉乘是一个升维操作,结果是一个垂直于当前向量所构成的平面的一个向量。

image.png

image.png

有一个计算三角形面积的公式就是

image.png

于是对于二维向量,叉乘的模是这两个向量构成的四边形面积。三位空间就是立方体体积了。

由于叉乘的结果是向量,向量就涉及到了方向,我们一般用的是右手坐标系。手朝着x方向伸开,然后手指向y方向旋转,伸开大拇指指向的方向就是z。如下图所示:

image.png

那叉乘如何计算呢?

结合叉乘的方向规律:

image.png

可以如下计算:

image.png

行列式

在计算矩阵的行列式的时候的时候,用的普遍方法就是某行的元素和对应余子式乘积之和,如下所示:

image.png

image.png

image.png

对于2个二维向量,行列式的值就是这两个向量构成的矩形面积:

image.png

对于3维向量,推导类似:

image.png

有了这样的几何解释,那么如果需要表示3个点构成的平面就可以写成如下格式:

image.png

这儿的每列都是从点(x,y,z)到已知点的向量,如果他们构成的体积是0,那就说明点(x,y,z)和已知的3个点共面。

特征值和特征向量

矩阵A表示一个变换,可能是旋转,平移,缩放中的一个或几个,如果对某个向量按照A变换后,结果方向没变,只是进行了缩放,那么这个向量就是特征向量,对应的缩放因子就是特征值。如下式所示:

image.png

如果要计算特征值和特征向量,那么就可以计算:

image.png

由于这种情况下,a的解应该需要不唯一,因此就需要前面的矩阵式奇异的,也就是行列式为0。这时候就可以解出特征值,然后再代入就可以计算出特征向量了。一个特征值对应的特征向量不止一个,因此可以取单位向量。

如果矩阵A是对称矩阵,这时候就会有一个性质:

image.png

Q是特征向量构成的矩阵,这时候的Q也是正交矩阵,D是对角矩阵,对角线上的值是特征值。这就是特征值分解。

奇异值和奇异值分解(SVD)

一般遇到的矩阵可能并不是对称的,也可能不是行列一样的,为了更一般话,就有了奇异值分解。形式如下:

image.png

这后的U和V可以不一样。U是左正交矩阵,V是右正交矩阵。如果要计算奇异值,可以按照下面公式:

image.png

2D线性变换

缩放

缩放就是针对某个维度按比例缩放

image.png

这时候的输出就是[x,y]向量进行缩放后的向量。

变形

就是让向量向某个方向倾斜,矩阵如下:

image.png

旋转

就是让向量以原点为中心,逆时针旋转一个角度。如图所示:

image.png

推导如下:

image.png

旋转一个角度后成为b

image.png

image.png

image.png

这时候的旋转矩阵是一个正交矩阵。

反射

反射其实就是把x或者y坐标取反就行:

image.png

变形的组合和分解

图形的变形都可以看成是上述几种变形方式的组合,而某一个图形的变形也可以拆成几个基本变形的组合。 这时候再看下特征值分解:

image.png

R就是旋转,S是缩放。 这样A变换就可以看成是如下3步:

  1. 将特征向量旋转到x,y坐标轴,成为x,y方向的标准向量。(R的转置乘以特征向量,结果就是单位向量)
  2. 按照特征值进行缩放
  3. 再将x,y坐标轴旋转到特征向量方向 如下图所示:

image.png 类似地看下奇异值分解:

image.png 可以看成如下步骤:

  1. 旋转右奇异向量到标准坐标系 2.按照奇异值进行缩放
  2. 再将x,y坐标旋转到左特征向量方向

image.png

3D线性变换

对于缩放和变形,区别不大,对于旋转会复杂一些,因为多了一个坐标轴,不过如果是绕着某个坐标轴旋转,其实还是和2D旋转类似:

image.png

image.png

如果需要绕任意一个向量旋转,那么就可以这样操作:

  1. 以该向量为一个坐标系,生成2个向量,使得这三个向量构成两两正交,也就是成为了一个坐标系,具体方法就是利用叉乘;对应的正交矩阵就是R,这两个向量是对应的行向量
  2. 将该向量乘以矩阵R,这时候就可以将该向量旋转到标准坐标系的某个轴上
  3. 执行旋转 4.乘以R的装置,就可以再旋转第一步生成的坐标系中 具体公式如下,这儿是将旋转向量旋转到了z轴上:

image.png

法线的变换

法线垂直于平面,当我们对向量进行变换的时候,其实是针对向量构成的平面进行变换。那这个平面对应的法线需要如何变换才能保持依旧垂直于平面呢?我们推导下法线的变换矩阵:

image.png

n是法线,t是切线,M是向量的变换矩阵:

image.png

Unnamed Draft 2.jpg

这样就得到了针对法向量的变换矩阵。

仿射变换

目前介绍的变换矩阵不支持平移,比如需要把某个平面沿x皱移动一定的距离,目前的变换矩阵是不支持的。那如何使用矩阵来支持平移变换呢?那就是再加一维(齐次坐标)。如下所示:

image.png

这就是仿射变换。

坐标系变换

在图形变换中,会涉及到多个坐标系,比如基于某个物体的局部坐标系,基于整个空间的整体坐标系,还有基于Camera的观察坐标系,那某个坐标系的点在另外一个坐标系中如何表示呢? 对于2D空间,就可以看成先旋转成和目标坐标系同方向,然后再平移。 如下所示:

image.png

image.png

image.png

反过来也一样:

image.png

image.png

对于3D也是同样的道理:

image.png