【OSG学习笔记】Day 4: 矩阵变换

0 阅读15分钟

去除图片水印 (1).png

计算机图形学数学基础

核心变换:模型变换、视图变换与投影变换

在计算机三维图形渲染、游戏开发、三维建模、虚拟现实等领域,模型变换、视图变换、投影变换是构建三维视觉效果的三大核心基础变换,三者层层递进、协同工作,共同完成将三维空间中的物体,转化为二维屏幕上可显示图像的完整流程。

这三种变换常被合称为“MVP变换”(Model-View-Projection),是图形学管线中最关键的几何处理环节,也是理解三维渲染逻辑的核心入口。

想要彻底分清三者的区别,首先要明确三维渲染的核心逻辑顺序:先定义物体自身的局部形态(模型空间),再将物体放到三维世界的指定位置(世界空间),然后模拟相机视角观察世界(观察空间),最后将三维观察结果压缩成二维平面图像(屏幕空间)。

模型变换、视图变换、投影变换,恰好对应这一流程中的三个关键步骤,缺一不可,且顺序绝对不能颠倒。


四大空间与变换逻辑

在正式讲解三种变换前,需要先明确图形学中四个核心空间的定义,这是理解变换的基础,所有变换本质都是空间坐标的转换:

  • 模型空间(局部空间/Object Space):物体自身的独立坐标系,原点通常在物体几何中心或底部,是建模软件中创建物体时的原始空间,此时物体与世界其他对象无关联,只关注自身形状。

  • 世界空间(World Space):整个三维场景的全局坐标系,所有物体、光源、相机都在这个空间中拥有统一坐标,是场景的“全局地图”。

  • 观察空间(相机空间/View Space):以相机为原点、相机视线为Z轴的局部坐标系,相当于把相机放在场景中,以相机视角重新定义所有物体的位置,模拟人眼观察的视角。

  • 裁剪空间与屏幕空间:裁剪空间是投影变换后的中间空间,用于剔除屏幕外的物体;屏幕空间则是最终映射到二维显示器的像素坐标空间。

三者的执行顺序固定为:模型变换 → 视图变换 → 投影变换,后续的光栅化、片元着色都基于这三步变换完成的坐标计算。

模型变换(Model Transformation):物体的“定位与塑形”

1. 核心定义与作用

模型变换,是将物体从模型空间转换到世界空间的变换,简单来说,就是给场景中的物体“摆位置、调姿态、改大小”。每个三维物体在建模时都处于自身局部坐标系,默认位置在原点、姿态端正、大小为原始尺寸,模型变换就是把这个原始物体,放到三维世界的指定位置,同时调整它的旋转角度和缩放比例,让多个物体能在全局场景中有序排布,构成完整的三维环境。

2. 核心变换类型

模型变换包含三种基础几何变换,通常通过组合4x4齐次变换矩阵实现(图形学中统一用齐次坐标,方便平移、旋转、缩放复合计算),三种变换可单独使用,也可按“缩放→旋转→平移”的顺序复合计算:

  • 平移变换(Translation):改变物体在世界空间的位置,沿X、Y、Z轴移动指定距离,不改变物体形状和姿态,是最基础的定位操作。比如将一个立方体从世界原点移动到坐标(5,3,2)的位置,就通过平移矩阵实现。

  • 旋转变换(Rotation):改变物体的朝向姿态,绕X、Y、Z轴旋转指定角度,常用欧拉角、四元数或旋转矩阵实现,四元数可避免旋转时的万向锁问题,是游戏开发中的主流选择。比如让模型抬头、转身、翻转,都属于旋转变换。

  • 缩放变换(Scale):改变物体的大小尺寸,沿X、Y、Z轴按比例缩放,等比例缩放保持物体形状,非等比例缩放会拉伸或挤压物体。比如将一个小球放大两倍,或将长方体压扁,都通过缩放矩阵实现。

3. 核心特点与应用场景

模型变换是针对物体本身的变换,每个物体都有独立的模型矩阵,场景中有多少个物体,就需要计算多少次对应的模型变换。它的核心作用是构建静态场景布局、实现物体动态位移(比如角色移动、物体飘落)、调整模型比例适配场景。举个直观例子:在三维场景中创建一棵树,建模时树在局部原点,模型变换就是把这棵树移到山坡上、旋转一定角度贴合地形、缩放成合适大小,让它融入整个森林场景。

image.png

视图变换(View Transformation):相机的“视角定位”

1. 核心定义与作用

视图变换,是将物体从世界空间转换到观察空间的变换,也被称为“相机变换”,核心作用是模拟人眼或相机的观察视角,相当于把整个三维世界“搬到”相机的视角下重新定位。如果说模型变换是移动物体,那么视图变换就是移动相机,最终实现的视觉效果一致,但逻辑完全不同:模型变换改物体位置,视图变换改观察角度。

从数学逻辑来看,视图变换等价于将相机从世界空间的位置,平移旋转到世界原点,同时让相机视线对准-Z轴方向,整个世界中的所有物体都跟随相机做反向的平移和旋转,最终所有物体坐标都转换为以相机为中心的相对坐标,方便后续投影计算。

2. 视图变换的核心参数

视图变换通过视图矩阵实现,构建视图矩阵需要三个核心参数,也是相机的核心属性:

  • 相机位置(Eye Position):相机在世界空间中的坐标,决定观察点的位置。

  • 观察目标(Look At Target):相机视线对准的目标点,决定相机的朝向。

  • 相机上方向(Up Vector):定义相机的顶部方向,避免相机倾斜扭曲,通常用世界空间的Y轴正方向(0,1,0)。

3. 核心特点与应用场景

视图变换是针对整个场景的变换,一个场景同一时间只有一个视图矩阵(单相机场景),所有物体共用同一个视图变换。它的核心作用是控制观察视角,实现游戏中的第一人称视角、第三人称视角、俯视角、过场动画镜头移动等效果。比如第一人称射击游戏中,玩家移动鼠标转头、移动角色改变视角,本质就是修改视图矩阵,更新观察空间,让场景物体呈现出不同的视角效果。

关键区分:模型变换 vs 视图变换 模型变换改变物体在世界中的位置,物体本身动了;视图变换改变观察角度,物体没动,只是看的角度变了。比如想让物体出现在屏幕左侧,既可以把物体向右平移(模型变换),也可以把相机向左移动(视图变换),视觉效果一致,但底层逻辑完全不同。

投影变换(Projection Transformation):三维到二维的“压缩映射”

1. 核心定义与作用

投影变换,是将物体从观察空间转换到裁剪空间的变换,是MVP变换中最后一步,也是最关键的一步——将三维空间坐标转化为二维屏幕坐标。因为显示器是二维平面,无法直接显示三维信息,投影变换的核心作用就是按照指定的投影规则,把三维观察空间中的物体,压缩映射到二维平面上,同时保留空间的远近关系,实现立体视觉效果。

投影变换还会完成裁剪操作,剔除相机视锥体以外的物体,这些物体不会出现在屏幕上,减少后续渲染计算量,提升渲染效率。

2. 两大核心投影类型

投影变换主要分为正交投影和透视投影,是图形学中最常用的两种投影方式,适用场景完全不同:

(1)透视投影(Perspective Projection)

透视投影是最贴合人眼视觉习惯的投影方式,核心特点是近大远小:距离相机越近的物体看起来越大,距离越远的物体看起来越小,最终的视线会汇聚到消失点,完美模拟现实世界的立体空间感。

透视投影通过视锥体(平截头体)定义可见范围,视锥体由近裁剪面、远裁剪面、左右上下裁剪面围成,只有在视锥体内的物体会被渲染。构建透视投影矩阵需要参数:视场角(FOV)、屏幕宽高比、近裁剪面距离、远裁剪面距离。

适用场景:3D游戏、三维动画、虚拟现实、建筑可视化等需要真实立体效果的场景,比如FPS游戏、开放世界游戏,几乎都用透视投影。

(2)正交投影(Orthographic Projection)

正交投影也叫平行投影,核心特点是没有近大远小效果,所有物体的大小不随距离变化,投影线互相平行,物体的实际尺寸和屏幕显示尺寸完全一致,只保留形状,不体现空间深度。

正交投影的可见范围是一个长方体,而非视锥体,构建正交投影矩阵需要参数:左右边界、上下边界、近远裁剪面距离。

适用场景:2D游戏、工程制图、三维建模的正交视图、UI界面渲染、CAD设计等需要精准尺寸、不考虑空间透视的场景,比如建筑平面图、游戏技能栏UI、像素风游戏。

3. 核心特点与后续流程

投影变换完成后,坐标会被转换为标准化设备坐标,随后通过视口变换,映射到实际屏幕的像素坐标,进入光栅化阶段,最终生成我们看到的图像。投影变换同样是全场景共用一个投影矩阵,单相机场景只需计算一次。


MVP变换整体流程总结

为了更清晰理解三者的协同关系,用一句话概括完整渲染流程:

先通过模型变换,把每个物体放到三维世界的指定位置;再通过视图变换,切换到相机的观察视角;最后通过投影变换,把三维观察结果压缩成二维屏幕图像,完成从3D模型到2D画面的转化。

变换类型空间转换核心作用核心操作适用对象
模型变换模型空间→世界空间物体定位、调姿、缩放平移、旋转、缩放单个物体(多矩阵)
视图变换世界空间→观察空间模拟相机观察视角相机定位、朝向调整全场景(单矩阵)
投影变换观察空间→裁剪空间3D转2D,实现透视/正交效果透视投影、正交投影全场景(单矩阵)

数学实现

模型变换数学原理

在讲变换数学之前,先明白一个基础常识:所有三维模型,刚做出来的时候,都待在自己的“局部原点”,也就是模型空间。

比如咱们之前说的那棵树,建模软件里刚建好的树干、树枝、树叶,所有组成树的小点(专业叫顶点),都有自己的三维坐标(x, y, z)

咱们可以把这个坐标理解成模型的“家庭住址”,x代表左右方向,y代表上下方向,z代表前后方向,局部原点(0,0,0)就是这棵树的“老家中心”。

核心数学前提:三维模型是由无数个顶点组成的,只要改了每个顶点的坐标,整个模型的形态和位置就会跟着变,模型变换,就是批量给所有顶点算新坐标,这就是最底层的数学逻辑,没有任何玄乎的地方。

模型变换总共就三件事:平移(挪位置)、缩放(变大小)、旋转(转方向) ,对应三套最基础的数学运算,咱们一个个拆,全程不用记复杂公式,懂道理就行。

1. 平移变换:给坐标做加法,把模型挪到想去的地方

通俗理解:平移就是把模型从A点挪到B点,不改变模型的大小和朝向,纯纯的“搬家”,就像把桌上的杯子从左边挪到右边,往上挪一点,往前挪一点。

数学原理(小白版) :给每个顶点的x、y、z坐标,分别加上一个固定的数字,这个数字就是平移的距离。

  • x坐标加减:控制模型左右移动,加正数向右挪,加负数向左挪
  • y坐标加减:控制模型上下移动,加正数向上挪,加负数向下挪
  • z坐标加减:控制模型前后移动,加正数向前挪,加负数向后挪

实例:树木挪到山坡上

刚建好的树,根部顶点坐标是(0,0,0),现在要把它挪到山坡上,山坡的位置是向右5米,向上3米,向前2米,那直接给树的所有顶点坐标做加法:

新x = 原来x + 5;新y = 原来y + 3;新z = 原来z + 2

就这么简单的加法,整棵树就从局部原点,挪到了山坡的指定位置,没有任何复杂运算,小学加法就能搞定。

2. 缩放变换:给坐标做乘法,把模型变大或变小

通俗理解:缩放就是把模型放大、缩小,或者压扁拉长,就像拍照时放大缩小物体,或者把橡皮泥捏扁、拉长。

数学原理(小白版) :给每个顶点的x、y、z坐标,分别乘一个固定的数字,这个数字就是缩放比例,专业叫缩放因子。

  • 缩放因子 = 1:模型大小不变,原封不动
  • 缩放因子 > 1:模型变大,比如乘2,就放大两倍
  • 0 < 缩放因子 < 1:模型变小,比如乘0.5,就缩小一半
  • 不同轴乘不同数:会拉伸变形,比如x乘1,y乘0.5,z乘1,模型就会被压扁

实例:树木缩放到合适大小

刚建好的树太大,和森林场景不搭配,需要缩小到原来的0.8倍,那就给树的所有顶点坐标统一乘0.8:

新x = 原来x × 0.8;新y = 原来y × 0.8;新z = 原来z × 0.8

如果想让树干细一点,就单独给x轴和z轴乘0.6,y轴不变,树干就会变细,高度不变,全靠乘法控制,一目了然。

3. 旋转变换:用角度算新坐标,让模型转方向

通俗理解:旋转就是让模型绕着某个轴转圈圈,改变朝向,比如让树转一下贴合山坡斜度,让角色转头,让箱子翻面,这是三种变换里稍微需要理解一点角度的,但依旧不用怕复杂公式。

旋转不能直接加减乘除,因为转圈会改变x和y、x和z之间的相对位置,核心是用旋转角度,通过三角函数(正弦sin、余弦cos)算出每个顶点旋转后的新坐标

咱们不用背三角函数公式,只需要懂逻辑:

  • 绕Y轴旋转:左右转头,改变x和z坐标,y坐标不变(比如树木贴合山坡,左右转方向)
  • 绕X轴旋转:前后俯仰,改变y和z坐标,x坐标不变(比如树木顺着山坡倾斜)
  • 绕Z轴旋转:左右歪头,改变x和y坐标,z坐标不变

简单说:转多少度,就用这个角度的sin和cos值,重新算顶点的横纵坐标,所有顶点一起转,整个模型就跟着转了

实例:树木旋转贴合山坡

山坡是倾斜的,树不能直直立着,需要绕X轴转15度贴合地形,软件会自动拿15度的sin和cos值,给树的每个顶点算新的y和z坐标,算完之后,整棵树就顺着山坡斜过来了,完美融入地形,底层就是角度和三角函数的简单计算。

标准变换顺序

先缩放 → 再旋转 → 最后平移,对应矩阵运算顺序是:总变换矩阵 = 平移矩阵 × 旋转矩阵 × 缩放矩阵,顶点最终坐标 = 总变换矩阵 × 原始顶点坐标,运算顺序是从右往左依次执行,先算最右侧的缩放,再算旋转,最后算左侧的平移

总结

模型变换、视图变换、投影变换是计算机三维图形学的基石,MVP变换矩阵更是贯穿整个图形渲染管线的核心数据。无论是游戏开发、三维建模、影视特效还是工业仿真,都离不开这三种变换的支撑。理解三者的核心逻辑、空间转换关系和应用场景,不仅能吃透三维渲染的底层原理,更能在实际开发中精准控制物体位置、相机视角和画面效果,是入门图形学必须掌握的核心知识点。 去除图片水印.png