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

快速跳转:
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、动画(物理模拟、质点弹簧系统、粒子系统、运动学、动作捕捉、欧拉方法)


1 二维变换

1.1线性变换

图形学中的矩阵乘以向量通常被称为线性变换,因为这个操作满足线性变换的数学定义和性质。线性变换是指一种将一个向量空间中的向量映射到另一个向量空间中的映射,它同时满足以下两个性质:

  • 叠加性(Additivity):对于任意两个向量 uv,线性变换T(u + v) = T(u) + T(v)。这表示变换对向量的加法操作保持了线性性质。
  • 数乘性(Scalar Multiplication):对于任意标量c和向量u,线性变换T(cu) = c·T(u)。这表示变换对向量的数乘操作同样保持了线性性质。

这种线性变换的性质在图形学和计算机图形学中非常有用,因为它们允许我们进行各种形状的变换,如平移旋转缩放等,并且可以通过矩阵乘法来高效地实现这些变换。

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

1.1.1 缩放变换

在这里插入图片描述

1.1.2 剪切变换

水平剪切是将对象或图形沿着水平方向上的平行线进行平移,从而改变对象的形状。水平剪切通常用于在二维平面上调整对象的形状,例如文本倾斜的效果

假设我要做如下倾斜效果,请推导出变换矩阵

  • 整个图形的内部点y分量没变,但x值都增加了,设偏移量为 Δ x \Delta x Δx,不难看出根据y的值不同,往上 Δ x \Delta x Δx越大,因此x' = x + ayy' = y

在这里插入图片描述

  • 转化为矩阵乘法:
    在这里插入图片描述

1.1.3 旋转变换

在这里插入图片描述

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

1.2 仿射变换

平移变换:非线性变换,因不满足线性变换中的:叠加性T(u + v) = T(u) + T(v))。因此,虽然平移是一种非常常见的空间变换,但它通常被视为一种仿射变换而不是线性变换。平移变换的结构如下:
在这里插入图片描述
仿射变换是由上面介绍的线性变换以及平移变换组成的,它是一种更广泛的变换类别。因此图形学中用仿射变换来描述各种平移旋转缩放等操作。

2 齐次坐标概念

为了统一仿射变换的表示方式(平移变换有个+常矩阵),须借助齐次坐标系统。它一种扩展了传统笛卡尔坐标系统的数学表示方法,它在表示几何变换时具有一些优势。

在齐次坐标系统中,一个2D点的坐标通常表示为三维向量(x, y, w),其中xy是点在笛卡尔坐标系统中的坐标,而w是一个额外的权重因子。齐次坐标中的点(x, y, w)可以通过除以w来得到它在标准笛卡尔坐标中的坐标(x/w, y/w)。这种表示方式允许我们用同一种结构形式表示点和向量,并且可以更方便地进行仿射变换。

w = 1
向量w = 0
在这里插入图片描述
在2D齐次坐标系下,仿射变换被统一为矩阵 × 向量
在这里插入图片描述

3 三维变换

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

3.1 缩放

在这里插入图片描述

3.2 位移

在这里插入图片描述

3.3 旋转

3.3.1 绕标准轴旋转

在这里插入图片描述

3.3.2 绕过原点的任意轴旋转

如果绕任意轴旋转怎么描述?先平移到原点,绕过原点轴旋转、平移回去即可
在这里插入图片描述

  • 一般的3D的变换就可以写成这样
    先对各种变换矩阵做乘法合成一个矩阵再应用到目标点
    在这里插入图片描述

3.4 四元数(额外知识,有兴趣深入研究的可以看看)

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

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

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

4 M V P 变换

4.1 模型变换(Model Transformation)

局部空间:就是以其自身的中心点或者某个端点为原点所的一个局部坐标系

模型变换:使用若干仿射矩阵变换操作,把物体从的局部空间转换到世界空间的过程。这些缩放、旋转、平移都是合并成一个矩阵传给GPU给每个顶点应用的。比如在引擎中导入一个模型,放入场景中,定义他的Transform.positionTransform.rotationTransform.scale 等同于定义了三个变换矩阵。模型变换就是在世界中摆放模型

4.2 视图变换(View Transformation)

也叫做Camera Transform,比较形象,因为这个变换矩阵的所有参数是根据相机参数计算得到的。

如何在3D空间中描述一个摄像机?
需要位置向量 e、向上的方向向量 t、向前的方向向量 g
在这里插入图片描述
视图变换过程:

  • 计算视图变换矩阵(V矩阵),使得该矩阵能够把世界空间中摆放的相机移动到原点,且向上的 t 向量旋转到与 Y 轴重合,g 看向 -Z 轴,右向量与x轴正向重合
  • 对相机和空间所有其他物体做V矩阵变换,使相机与其他物体保持相对静止,这样的操作使得相机变换前后所看到的场景是完全一致的,并且相机位于原点与坐标轴朝向一致,非常便于后续计算。

View矩阵计算

  • 两个矩阵:平移 x 旋转,此M不是MVP的M,只是视图矩阵的符号
    在这里插入图片描述

    • T v i e w T_{view} Tview平移矩阵非常简单,就是把相机移动到原点如下
      在这里插入图片描述
    • R v i e w R_{view} Rview矩阵的计算
      • 摄像机从他目前的朝向状态旋转到原点的三个轴重合的矩阵并不好算,但从原点旋转到相机目前的状态所对应的矩阵则很简单
        在这里插入图片描述
        因为旋转矩阵是正交矩阵,所以旋转矩阵的逆 = 旋转矩阵的转置。简单转置一下就得到了逆矩阵Rview,即能使向上的 t 向量旋转到与 Y 轴正方向重合,g 看向 -Z 轴,

在这里插入图片描述

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

透视投影最典型的特点:近大远小,这就是正常人类的视角或者摄像机的视角

相当重要的回顾:在齐次坐标下的点(kx,ky,kz,k)在笛卡尔坐标系中的坐标为(x,y,z)

怎么做透视投影 —— 仅两步:先挤压(Squish),再正交投影。注意这个过程,视锥体中越远的部分被压缩的比例越大,因此这一步其实是近大远小的关键
在这里插入图片描述

(1)挤压(Squish)变换

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

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

  • 找特殊点,建立方程组
    • 首先第一个特殊点:在我们取下图所示位于视椎体内部,上平面上的任意点(x,y,z),注意不是远平面上的点
      在这里插入图片描述
    • 对于这个特殊点,在透视的两阶段变换后(挤压变换+正交投影),会变到视锥体近平面(x',y',z')上。
      在这里插入图片描述
      根据相似三角形的性质可得以下方程,这里z、x、n、y都是已知量
      在这里插入图片描述
  • 依据这俩等式,在齐次坐标系下,做恒等变形,可以得到一个矩阵方程
    • 注意目前并不知道z是如何变化的
      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

    • 因此公式①可以改写为
      在这里插入图片描述

    • 然后就可以得到矩阵的这些数据了:
      在这里插入图片描述

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

  • 规则2:近平面上的点变换前后z值不变
    • 对于之前建立的方程,把近平面的点带入(近平面上的点z值为n)。
      在这里插入图片描述
    • 目的明确,求M矩阵的第行,那就直接看n2。只有M矩阵第三行的前两个元素为0才可能得到n2所以与点坐标xy分量无关。未知数只剩下两个,设为A和B(注意n是近平面的z值,已知为n)
      得到方程1
      在这里插入图片描述
  • 规则3:远平面上的点变换前后的z值不变
    同理得到方程2:
    在这里插入图片描述
  • 最终A、B为
    在这里插入图片描述

最后,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的正则立方体中


所有这些仿射变换一般来说是在GPU端顶点着色器内对场景的每个顶点应用的。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宗浩多捞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值