美文网首页
图形中的线性代数

图形中的线性代数

作者: android小奉先 | 来源:发表于2022-02-27 20:27 被阅读0次

概要

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

向量

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


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
    可以看成如下步骤:
  4. 旋转右奇异向量到标准坐标系
    2.按照奇异值进行缩放
  5. 再将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

相关文章

  • 图形中的线性代数

    概要 本篇介绍下图形学中涉及的线性代数,通过本篇的学习,可以为后续学习图形的各种变换打下坚实的基础。为了避免单纯介...

  • 开源C ++库的综合列表

    1、通用 Boost - 大量通用库 Dlib - 网络、线程、图形界面、数据结构、线性代数、机器学习、XML和文...

  • NumPy 中的线性代数

    NumPy 中的线性代数 矩阵 线性代数 多项式 曲线拟合

  • 第二章 机器学习中的线性代数知识

    第二章 机器学习中的线性代数知识 线性代数作为数学中的一个重要的分支,广发应用在科学与工程中。掌握好线性代数对于理...

  • 透析矩阵,由浅入深娓娓道来—高数-线性代数-矩阵

    线性代数在科学领域有很多应用的场景,如下: 矩阵,是线性代数中涉及的内容, 线性代数是用来描述状态和变化的,而矩阵...

  • 花书第二章笔记

    [ToC] 第二章 线性代数 简要介绍深度学习算法中涉及到的线性代数知识。 掌握深度学习中所需要的线性代数和矩阵求...

  • Numpy基础入门

    一. Numpy的主要功能 数组的算数和逻辑运算。 傅立叶变换和用于图形操作的例程。 线性代数有关的操作。 Num...

  • 2019-07-07

    NumPy - 线性代数 NumPy 包包含numpy.linalg模块,提供线性代数所需的所有功能。 此模块中的...

  • 正交矩阵(Orthogonal Matrix)

    3D数学基础 图形和游戏开发(第二版)笔记 正式线性代数规则 定义: 等价于 旋转矩阵和反射矩阵都是正交的。如果...

  • Python学习笔记(4):Numpy基础之线性代数与随机数

    目录 一、线性代数 二、随机数生成示例:随机漫步 一、线性代数 经过之前的学习,可以看出numpy中的“*”代表的...

网友评论

      本文标题:图形中的线性代数

      本文链接:https://www.haomeiwen.com/subject/nfkcrrtx.html