计算机图形学【GAMES-101】1、矩阵变换原理Transform(旋转、位移、缩放、正交投影、透视投影)

article/2025/9/15 4:13:42

快速跳转:
1、矩阵变换原理Transform(旋转、位移、缩放、正交投影、透视投影)
2、光栅化(反走样、傅里叶变换、卷积)
3、着色计算(深度缓存、着色模型、着色频率)
4、纹理映射(重心坐标插值、透视投影矫正、双线性插值MipMap、环境光遮蔽AO)
5、几何(距离函数SDF、点云、贝塞尔曲线、曲面细分、曲面简化)
6、阴影映射(Shadow Mapping)
7、光线追踪原理(线面求交、预处理光追加速)
8、辐射度量学与光线追踪
9、蒙特卡洛路径追踪(Path Tracing)(光源采样)
10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)
11、渲染前沿技术介绍(双向路径追踪BDPT、MLT、光子映射、实时辐射度、外观建模)
12、相机(视场、曝光、光圈(F-Stop)、薄棱镜近似、CoC、景深)
13、光场、颜色与感知
14、动画(物理模拟、质点弹簧系统、粒子系统、运动学、动作捕捉、欧拉方法)


Lecture3~4

  • 1 2DTransformations
    • 1.1 Linear Transforms线性变换
    • 1.2 Scale
    • 1.3 Shear
    • 1.4 Rotation
    • 1.5 Translation
  • 2 齐次坐标
  • 3 3DTransformations
    • 3.1 Scale
    • 3.2 Translation
    • 3.3 Rotation
    • 3.4 四元数(额外知识,有兴趣可以看看)
  • 4 MVP Transformation
    • 4.1 模型变换(Model Transformation)
    • 4.2 View Transformation
    • 4.3 Projection Transformaion
      • 4.3.1 正交投影:Orthographic projection
      • 4.3.2 透视投影:Perspective projection
        • (1)挤压(Squish)变换
        • (2)正交投影
    • GAMES101图形学专栏

1 2DTransformations

1.1 Linear Transforms线性变换

定义线性变换为:矩阵×向量
在这里插入图片描述

1.2 Scale

在这里插入图片描述

1.3 Shear

  • 注意观察所有点的y值没发生变化,只有x值变化(x’ = x + ay)
    ay怎么来的?计算方法很多,比如通过相似三角形设偏移量为△x,则在y高度上的所有x的增量△x为
    y/1 = △x/a, 则△x = ay

在这里插入图片描述
切变矩阵为
在这里插入图片描述

1.4 Rotation

在这里插入图片描述

  • 推导过程可设矩阵四个未知量为ABCD,然后带入特殊点(1,0) (0,1)解方程组即可得出ABCD
  • 旋转-θ矩阵就是旋转θ的矩阵的逆矩阵,其实直接转置即可。对于旋转矩阵,转置矩阵=逆矩阵

1.5 Translation

  • 搞特殊,不是线性变换了
  • 这是仿射变换
    在这里插入图片描述

2 齐次坐标

  • 为了解决平移这个特殊的变换,把二维的点和向量都增加一个维度
    在这里插入图片描述
  • 齐次坐标下2D变换矩阵的形式则统一了
    在这里插入图片描述

3 3DTransformations

  • 跟2D一样,齐次坐标下都会增加一维
    在这里插入图片描述

3.1 Scale

在这里插入图片描述

3.2 Translation

在这里插入图片描述

3.3 Rotation

  • 绕标准轴旋转
    在这里插入图片描述
  • 过原点的任意轴旋转
    如果绕任意轴旋转怎么描述?先平移到原点,绕过原点轴旋转、平移回去即可
    在这里插入图片描述
  • 一般的3D的变换就可以写成这样
    先对各种变换矩阵做乘法合成一个矩阵再应用到目标点
    在这里插入图片描述

3.4 四元数(额外知识,有兴趣可以看看)

前面的变换都是欧拉角变换,来模拟旋转运动,但是欧拉角变换并不是运动,而是初始姿态到目标姿态的一个一步到位的变化。四元数的引入是为了更好的描述三维空间的旋转

为什么一般不用欧拉角变换来描述旋转运动?

  • 文章:万向节死锁
  • 视频:万向节死锁产生的原因
  • 四元数与3D旋转之间的关系

仅仅是使用四元数来做旋转的话看这个

  • 四元数的使用

4 MVP Transformation

4.1 模型变换(Model Transformation)

  • 模型的局部空间就是以其自身的中心点或者某个端点为原点所的一个局部坐标系
  • 模型变换:就是把物体从自身的局部空间转换到世界空间,比如在引擎中导入一个模型,放入场景中,定义他的Transform.position、Transform.rotation、Transform.scale 等同于定义了三个变换矩阵
  • 总之模型变换就是在世界中摆放模型

4.2 View Transformation

  • 也叫做Camera Transform,比较形象,因为主要就是对摄像机进行变换
  • 如何在3D空间中描述一个摄像机?仅仅描述位置是不够的
    需要Position e、向上单位向量t、向前单位向量g
    在这里插入图片描述
  • View Transform干的什么事情呢?
    相机和物体绑定在一起,相机移动到原点,向上的t向量与Y轴重合,g看向-Z轴,其他物体做同样的变换
  • 关键的理解:为什么要把物体和相机绑定在一起做变换?—— 方便计算投影变换
    因为我们的最终目的是得到一张图像,图像里面是相机所能看到的东西
    把相机和物体同步变换到原点,计算投影变得更容易,并且相机和物体相对位置并没发生任何变化,即得到的图像也不会变化

如果相机初始定义的时候,已经看向Z轴(或者-Z)那只需要把它平移到原点就行,不用再乘上一个旋转矩阵

  • View Transformatin变换矩阵
    • 相机到原点之间做的变换矩阵怎么算?
      两个矩阵:平移+旋转,此M不是MVP的M,只是View Matrix的记号
      在这里插入图片描述

    • Translation矩阵
      平移矩阵非常简单,就是把相机移动到原点如下
      在这里插入图片描述

    • Rotation矩阵
      摄像机从他目前的朝向状态,旋转到原点不好算。从原点旋转到相机目前的状态所对应的矩阵则很简单(推导过程省略)
      在这里插入图片描述
      用这个矩阵乘以原点y轴的的单位向量(0,1,0,0)T得到的就是(xt,yt,zt,0)即相机的向上的向量,之后在求其逆矩阵即可。因为旋转矩阵都是正交矩阵,所以旋转矩阵的逆 = 旋转矩阵的转置。从而就得到了Rview

  • 最终view矩阵Rview
    注意:t是up单位向量,g是单位前向量,e是位置这里没用到
    1行:g × t 得到的向右的向量的xyz分量 (注意是右手系)
    2行:t向量的xyz分量
    3行:-g向量的xyz分量
    在这里插入图片描述

4.3 Projection Transformaion

  • 两种投影方式(正交、透视)
    在这里插入图片描述

4.3.1 正交投影:Orthographic projection

  • 图形学中的做法
    定义一个立方体,尽可能的包裹想要显示的物体,用左右上下远近[l,r] [b,t] [f,n] 6个面定义
    把这个立方体映射到正则立方体[-1,1]3中,即两次变换(平移+缩放),然后物体会被拉伸,这并不影响结果,因为在得到最后图像之前,会反向变换回去
    在这里插入图片描述
  • 对应两次变换的矩阵如下,这就是最终的正交投影矩阵
    注意右边这个平移矩阵的记忆,比如(r+l)/2,结果是这个盒子中点的x坐标,如果这个坐标大于零,需要左移才能到原点;小于零,需要右移,所以才有前面的负号
    在这里插入图片描述

4.3.2 透视投影:Perspective projection

  • 透视投影最典型的特点:近大远小,这就是正常人类的视角或者摄像机的视角
  • 相当重要的回顾:在齐次坐标下
    任何一个点乘上一个非0数,即k(x,y,z,1)=(kx,ky,kz,k)都代表三维中的同一个点(x,y,z)
  • 怎么做透视投影 —— 仅两步:先挤压(Squish),再正交投影
    在这里插入图片描述

(1)挤压(Squish)变换

想象把视椎体(Frustum)压成一个方正的盒子(Cuboid),怎么压,矩阵怎么搞?

  • 规定:(1)近平面的点永远不变(2)远处平面的Z轴不变(3)远平面中心点不变

  • 找特殊点,建立方程组
    首先第一个特殊点:在我们取下图所示位于视椎体内部,上平面上的任意点(x,y,z),注意不是远平面上的点
    在这里插入图片描述

  • 对于这个特殊点,在投影变换后,会变到(x',y',z')上。
    挤压后z会怎么变不知道(其实会变远)
    但是由于挤压后要做正交投影,变换到(x',y',z'),正交投影xy是不会变的呀
    所以正交投影前,也就是挤压后的点的xy分量,会变成x’y’,根据相似三角形可得他们之间的关系
    在这里插入图片描述
    这里z、x、n、y都是已知量
    在这里插入图片描述

  • 从这俩就知道很多东西了,在齐次坐标系中做如下操作
    把视椎体中的任一点应用M挤压得到新的点,这个点的x,y是刚算出来的已知的点,但z是unknown,
    M p e r s p → o r t h o 4 × 4 ⋅ ( x y z 1 ) = ( n z x n z y ? 1 ) … … … … ① M_{persp\to ortho}^{4\times4}·\Large\begin{pmatrix} x\\y\\z\\1 \end{pmatrix} =\begin{pmatrix} \frac{n}{z}x\\\frac{n}{z}y\\?\\1 \end{pmatrix} \dots\dots\dots\dots① Mpersportho4×4 xyz1 = znxzny?1 …………

  • 这个点在齐次坐标下,所有分量同时×Z,表示的是同一个点,即
    ( n z x n z y ? 1 ) = ( n x n y ? z ) \Large\begin{pmatrix}\frac{n}{z}x\\\frac{n}{z}y\\?\\1 \end{pmatrix} = \begin{pmatrix}nx\\ny\\?\\z\end{pmatrix} znxzny?1 = nxny?z

  • 然后再带入公式①得到
    在这里插入图片描述
    这个方程就可以得到M矩阵的部分数值了
    在这里插入图片描述

  • 还有一行的数怎么得到?还有两个规则没用

  • (1)近平面上的点不变
    对于之前建立的方程,把近平面的点带入(近平面上的点z值为n),做M变换后,依然同×z
    在这里插入图片描述
    目的明确,求M矩阵的第三行,那就直接看n2
    只有M矩阵第三行的前两个元素为0,0才可能得到n2所以与xy无关系,未知数只剩下AB
    注意n是近平面的z值,是已知的
    得到方程1
    在这里插入图片描述

  • (2)远平面上的点的z值不变
    得到方程2:
    在这里插入图片描述
    最终AB算出来为
    在这里插入图片描述

最后,Squish矩阵 Mpersp->ortho矩阵为
[ n 0 0 0 0 n 0 0 0 0 n + f − f n 0 0 1 0 ] \large \begin{bmatrix} n&0&0&0 \\ 0 & n&0&0 \\ 0&0&n+f&-fn\\ 0&0&1&0 \end{bmatrix} \quad n0000n0000n+f100fn0

(2)正交投影

透视投影第二步是正交投影,所以需要正交矩阵Mortho(正交矩阵是平移加缩放矩阵组成的)
[ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] \large \begin{bmatrix} \frac{2}{r-l}&0&0&0 \\ 0 & \frac{2}{t-b}&0&0 \\ 0&0&\frac{2}{n-f}&0\\ 0&0&0&1 \end{bmatrix} \large \begin{bmatrix} 1&0&0&-\frac{r+l}{2} \\ 0 &1&0&-\frac{t+b}{2} \\ 0&0&1&-\frac{n+f}{2}\\ 0&0&0&1 \end{bmatrix} rl20000tb20000nf200001 1000010000102r+l2t+b2n+f1

最终Mpersp 为上面三个矩阵的乘积
M p e r s p = M o r t h o ⋅ M p e r s p → o r t h o = [ 2 n r − l 0 l + r l − r 0 0 2 n t − b b + t b − t 0 0 0 n + f n − f − 2 n f n − f 0 0 1 0 ] M_{persp} = M_{ortho}·M_{persp\to ortho}=\Large\color{red} \begin{bmatrix} \frac{2n}{r-l}&0&\frac{l+r}{l-r}&0 \\ 0 & \frac{2n}{t-b}&\frac{b+t}{b-t}&0 \\ 0&0&\frac{n+f}{n-f}&\frac{-2nf}{n-f}\\ 0&0&1&0 \end{bmatrix} \quad Mpersp=MorthoMpersportho= rl2n0000tb2n00lrl+rbtb+tnfn+f100nf2nf0

  • 叠加正交投影得到透视投影矩阵,Mortho是前面正交投影矩阵算出来的,先位移后缩放那个,所以这Mpersp是三个矩阵叠加

  • 由于透视投影的第二步实际上是正交投影,所以最终也会到[-1,1]3的正则立方体中


GAMES101图形学专栏


http://chatgpt.dhexx.cn/article/2CCTSqp3.shtml

相关文章

Tensorflow之矩阵变换

----------------------- 摘自 【维基百科】----------- 变换矩阵是数学线性代数中的一个概念。 在线性代数中,线性变换能够用矩阵表示。如果T是一个把Rn映射到Rm的线性变换,且x是一个具有n个元素的列向量,那么 {\displaystyle T({\vec {x}}…

three.js中的矩阵变换(模型视图投影变换)

文章目录 1. 概述2. 基本变换2.1. 矩阵运算2.2. 模型变换矩阵2.2.1. 平移矩阵2.2.2. 旋转矩阵2.2.2.1. 绕X轴旋转矩阵2.2.2.2. 绕Y轴旋转矩阵2.2.2.3. 绕Z轴旋转矩阵 2.3. 投影变换矩阵2.4. 视图变换矩阵 3. 着色器变换3.1. 代码3.2. 解析 4. 其他 1. 概述 我在《WebGL简易教程…

矩阵变换及其数学原理

矩阵变换及其数学原理 矩阵变换及其数学原理引子各种变换 平移矩阵缩放矩阵旋转变换 引子 推荐这篇文章线性代数的本质,这篇文章挺不错的,揭示了矩阵和向量的内涵。首先概要性的提一下 向量刻画的是线性空间中的对象。矩阵刻画的是向量在线性空间中的运…

计算机图形学之矩阵变换的深度理解

对于图形学来说,矩阵计算不可避免,既直观又方便。而如果线性代数学的不透彻的话,那么基本上是做不到应用的,这里推荐看一下3Blue1Brown的线性代数的视频,可以对矩阵计算有深刻的认识。 之后就是应用阶段,我…

图像处理-矩阵变换

Android中通过矩阵来处理图像问题是非常常见的。 图像中的每一个像素点都是一个颜色矩阵分量,然后我们让这两个矩阵相乘就能得到一个新的矩阵(新的颜色矩阵分量),这就是矩阵变换对图像中的每一个点的处理,使得对整个图…

shader中的常用矩阵变换

unity shader 矩阵学习 矩阵运算法则(1)矩阵和标量的乘法(2)矩阵和矩阵的乘法矩阵相乘的条件 和 结果的行数和列数 变换的基本概念(1)变换(2)线性变换(3)平移变换(4)仿射变换(5)齐次坐标 2D 矩阵变换&#…

【Matlab】矩阵变换与矩阵求值

矩阵变换与矩阵求值 对角矩阵:只有对角线上有非零元素的矩阵。 数量矩阵:对角线上的元素相等的对角矩阵。 单位矩阵:对角线上的元素都为1的对角矩阵。 diag函数 提取矩阵的对角线元素 diag(A):提取矩阵A主对角线元素&#x…

闫令琪图形学入门笔记(矩阵变换篇)

整个坐标变化过程贯穿管线渲染,它与光栅化、着色一同构成GPU完整的渲染过程。所以理解三维世界的坐标与矩阵变换是首要的学习内容 1.1 向量的点乘与叉乘 点乘 向量的点乘可以求得一个数,利用点乘可以进一步计算两向量的夹角大小,或者一个…

点云矩阵变换

点云矩阵变换 变换矩阵工作原理 : |-------> 变换矩阵列| 1 0 0 x | \| 0 1 0 y | }-> 左边是一个3阶的单位阵(无旋转)| 0 0 1 z | /| 0 0 0 1 | -> 这一行用不到 (这一行保持 0,0,0,1)要进行点云旋转,需要对3阶矩阵进行赋值 如何赋值参考&#xf…

OpenGL矩阵变换

参考内容: 1. 这次,彻底搞懂 OpenGL 矩阵转换 2. Article - World, View and Projection Transformation Matrices 模型变换的基本流程图: 1. 模型变换 模型变换解决的是,把物体在世界坐标系下的位置拆分成平移、缩放、旋转的…

MATLAB矩阵变换

目录 对角阵与三角阵 1、对角阵 (1)提取矩阵的对角线元素 (2)构造对角阵 2、三角阵 (1)上三角阵 (2)下三角阵 矩阵的转置与旋转 1、矩阵的转置 2、矩阵的旋转 3、矩阵的左右翻转 4、矩阵的上下翻转 矩阵的逆与伪逆 1、矩阵的逆 2、矩阵的伪…

Cesium 矩阵变换

在Cesium和其他三维开发中中经常用到矩阵变换。比如将一个物体移动、缩放、平移都可以用变换矩阵来计算。 再比如将三维场景中的物体转换为屏幕上显示的二维图形,需要用到透视投影(perspective projection)矩阵。 变换(tansform…

浅谈矩阵变换——Matrix

矩阵变换在图形学上经常用到。基本的常用矩阵变换操作包括平移、缩放、旋转、斜切。 每种变换都对应一个变换矩阵,通过矩阵乘法,可以把多个变换矩阵相乘得到复合变换矩阵。 矩阵乘法不支持交换律,因此不同的变换顺序得到的变换矩阵也是不相同…

变换矩阵

1、变换矩阵 变换矩阵可以分解为缩放,旋转,平移矩阵的乘积: M T * R * S - 右手坐标系 当均匀缩放时,旋转和缩放可以交换顺序 缩放和平移不可以交换顺序 2、子坐标系与父坐标系 由在父坐标系中的坐标位置P,和三…

矩阵基础与变换

矩阵基础 矩阵的基本概念 由 m n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m n矩阵(引用百度百科)。记作: 这mn 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列。 矩阵的加法 同型…

2.2 矩阵变换

写在前面:作者本人是纯纯的菜鸟,学习的内容来自于 中国大学MOOC 中南大学 《科学计算与MATLAB语言》,欢迎各位大佬或新手在这里和平讨论,如果我有错误请各位不吝赐教,提前感谢各位捧场! 何为矩阵变化&#…

线性代数学习笔记——第七十二讲——共轭矩阵

1. 本讲内容概要 2. 复数及其性质及复数的运算 3. 复共轭及模 4. 共轭矩阵的定义及性质

共轭矩阵 正定矩阵

https://blog.csdn.net/know9163/article/details/80551764

共轭 、 共轭转置、共轭矩阵、酉矩阵、正定矩阵、半正定矩阵

共轭复数 实数部分相同而虚数部分互为相反数的两个复数。 矩阵的共轭转置 把矩阵转置后,再把每一个数换成它的共轭复数。 自共轭矩阵 矩阵中每一个第i 行第j 列的元素都与第j 行第i 列的元素的共轭相等。 酉矩阵 AH 是A 的共轭转置 A叫做酉矩阵 正定矩阵 半正…

matlab-线性代数 对矩阵取共轭(不用函数)

由上图所示,可以得知:a是求矩阵的共轭转置,而a.是求矩阵的共轭。在数学中,共轭转置表示为在矩阵的右上角加上H。 如果矩阵是实数矩阵,那么a和a.的结果一样,都是求矩阵的转置,如下图所示&#xf…