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

2023-10-31

快速跳转:
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端顶点着色器内对场景的每个顶点应用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • bitlocker 恢复密钥

    开机出现问题 需要bitlocker 恢复密钥 登录Microsoft官网自己的账号 我的Microsoft账户 有问题电脑的详细信息 登录 找到对应密钥填入
  • STANet基于时空自注意力的神经网络--变化检测模型

    STANet基于时空自注意力的神经网络检测模型 A spatial temporal attention based method and a new dataset for remote sensing image change dete
  • C#----使用继承选择器创建继承窗体

    欢迎大家提出意见 一起讨论 转载请标明是引用于 http blog csdn net chenyujing1234 代码 VS2008 http www rayfile com zh cn files 68b23066 9aab 11e1
  • mos管驱动电路设计

    对于开关电源来说 驱动电路作为控制电路和功率电路的接口 其作用至关重要 本文就将详细探讨开关电源的驱动电路的参数设计以及驱动芯片的选型 常用的mos管驱动电路结构如图1所示 驱动信号经过图腾柱放大后 经过一个驱动电阻Rg给mos管驱动 其中
  • 集合nim(C++)

    题目 给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S 现在有两位玩家轮流操作 每次操作可以从任意一堆石子中拿取石子 每次拿取的石子数量必须包含于集合 S 最后无法进行操作的人视为失败 问如果两人都采用最优策略 先手是否必胜
  • RFID标签打印机在加工制造业中的应用

    1 行业背景 在物联网家电制造 机械制造 电子元器件 电器等产品加工制造行业中 通常都需要打印标签直接贴到产品上 如 铭牌标签 条码序列号标签 合格证标签 电路图标签 RFID标签等等 传统的部分企业的这些标签是印刷后粘贴到产品上 但是随着
  • 从小白到专家的五个阶段,你处在哪里?

    专家和新手的区别在哪里 每一个程序员都有一个梦想 成为领域内的专家 专家和新手有什么不同 1970年代左右 德雷福斯兄弟通过对飞行员 国际著名象棋大师的技能习得进行研究 他们发现专家和新手在技能调用上有很大的不同 并提出了德雷福斯模型 Dr
  • OpenStack中glance对接swift

    OpenStack中glance对接swift 一 环境介绍 二 查看数据库中glance相关信息 1 查询数据库glance用户密码 2 登录数据库 3 查询glance相关数据库 4 查询glance数据库表 5 查询image loc
  • HikariCP MBean (JMX) Monitoring and Management

    The JMX MBean for HikariCP exposes Idle Connection count Active Connections in use Total Connections The number of threa
  • 本地下载的软件包制作成本地repo源并使用apache发布

    背景 在前面的博客中 介绍了如何使用apt mirror同步远程的repo源 本文将介绍如何利用本地已经缓存的软件包制作成本地repo源 并对外提供源服务 应用目标 在应用中 有时候会遇到类似问题 远程的软件源太慢 而如果同步远程的软件源到
  • 国标GB28181协议视频平台EasyGBS内网访问正常,公网无法访问是什么原因?

    国标视频云服务平台EasyGBS可支持通过国标GB28181协议 接入多路视频源设备 实现视频流的接入 转码 处理与分发等功能 对外输出的视频流格式包括RTSP RTMP FLV HLS WebRTC等 平台视频能力丰富灵活 包括监控直播
  • XML中PCDATA与CDATA的区别

    XML中PCDATA与CDATA的区别 2011 02 10 19 27 25 分类 XML 标签 xml中pcdata与cdata的区别 字号 大中小 订阅 所有 XML 文档中的文本均会被解析器解析 只有 CDATA 区段 CDATA
  • C语言自定义类型详解(结构体 枚举 联合)

    目录 1 结构体类型 1 1声明 1 2结构的自引用 1 3结构体变量的定义和初始化 1 4结构体内存对齐 1 4 1结构体的对齐规则 1 4 2编译器的默认对齐数修改 1 5结构体传参 1 6结构体实现位段 位段的填充 可移植性 1 6
  • unity的asmdef报错GUID(这个报错记得重现一下,报错信息作为标题记录一下)

    这应该是unity给这个程序集分配的guid unity基于2020开发的科骏插件1 0 8 放到了2017 首先出现的这个报错 解决方法是将这个asmdef删除 asmdef简单来说是 库的描述信息文件 相关参考 初步理解Unity的as
  • SPI协议代码

    软件模拟SPI程序代码 文章目录 SPI协议简介 SPI接口介绍 SPI数据传输方向 SPI传输模式 通过两个单片机模拟SPI来加深理解 硬件连接方式 SPI模式 程序思路 主机C代码 波形 从机C代码 波形 概述 通过两个MCU STM3
  • Mybatis系列七:映射文件-自定义结果集

    一 案例1
  • 使用Clion进行Qt项目开发

    使用Clion进行Qt项目开发 创建项目并指定Qt CMake prefix path为Qt安装路径下的E Qt Qt5 9 1 5 9 1 mingw53 32 配置编译工具链 添加外部工具 找到Setting gt Tool gt Ex
  • 使用hexo和git实现多地更新和配置博客源文件

    使用hexo写博客的一个问题就是源文件都是在本地的 如果换了电脑需要更新博客时就会比较麻烦 目前 觉得比较靠谱的办法就是用github来管理了 主要的思路是 利用git分支实现 hexo生成的静态博客文件默认放在master分支上 hexo
  • 面向对象程序设计的基本概念

    原文链接 面向对象设计 类和对象 1 面向对象程序设计的基本概念 Java是一种面向对象的编程语言 面向对象编程 英文是Object Oriented Programming 简称OOP 那什么是面向对象编程 面向对象其实是现实世界模型的自
  • 计算机图形学【GAMES-101】1、矩阵变换原理Transform(旋转、位移、缩放、正交投影、透视投影)

    快速跳转 1 矩阵变换原理Transform 旋转 位移 缩放 正交投影 透视投影 2 光栅化 反走样 傅里叶变换 卷积 3 着色计算 深度缓存 着色模型 着色频率 4 纹理映射 重心坐标插值 透视投影矫正 双线性插值MipMap 环境光遮