完成重构,搭建起物理引擎基础框架,包含碰撞检测与移动方式以及物理量基类。
本篇借助重构进一步探索顶点与MVP矩阵理解(model->view->projection)
重构
Common
该项目以dll形式注入启动项目,主要包含通用操作如全局上下文,配置类,日志以及引擎所需接口如窗口接口,控制台接口,渲染类接口等
Console
控制台实现项目,以dll形式注入,通过实现Common
中createConsole
供主启动类创建出控制台。借助imgui实现
MainWindowUi
窗口实现项目,以dll形式注入,通过实现Common
中createWindow
供主启动类创建出主窗口。借助win32api实现
Renderer
渲染器,由dx11负责渲染,主要封装了dx11渲染操作。通过实现Common
中createDx11
供主启动类创建出渲染器实例。
这里不过多介绍代码实现,主要针对渲染器重构部分详解MVP矩阵概念。
渲染器重构
原有渲染是将每个形状作为渲染的主体,例如圆形
、三角形
等分别做成不同的类,类中包含位置
数据与移动所需movement
对象。
现有渲染将位置
数据搭配movement
对象作为渲染主体,不同的形状如圆形
、三角形
等通过顶点
定义。其中movement
对象包含速度
、加速度
与质量
,通过其他物理量计算出’物体’受力,进而计算出加速度
,借助半隐式欧拉积分
根据加速度
计算出速度
从而改变物体位置
。
如何理解顶点与MVP矩阵
再次回顾物体如何被渲染到屏幕上,渲染管线部分此处不赘述,从实现角度来讲,我们需要配置顶点
数据将形状绘制出来。那么顶点
与MVP
矩阵的含义与关系分别是什么。
顶点数据的本质定义
顶点(Vertex)是三维空间中最基础的几何单元,通过坐标(x,y,z)及其附属属性(法线、纹理坐标等),在概念层面构建出物体的抽象几何轮廓。这就如同我们在脑海中勾勒一个人物形象时,首先会用点线面搭建其基本外形 —— 头部的球体、躯干的立方体、四肢的柱体等,这些关键位置的坐标点集合,就是定义物体抽象形状的 “数字蓝图”。顶点数据不包含任何空间位置信息,仅仅是几何形态的纯数学描述,类似于建筑设计中的 CAD 模型草图。
模型矩阵(Model Matrix)—— 从概念到世界的具现化
模型矩阵负责将顶点定义的抽象几何形态,转换到具体的三维世界坐标系中。它包含三个核心变换操作:
平移(Translation):确定物体在世界中的具体位置(如将水杯放置在桌面坐标(10,0,5)处)
缩放(Scale):定义物体的实际尺寸(如将鼠标模型缩小至真实比例的 1/10)
旋转(Rotation):设定物体的空间姿态(如让机械臂绕 Y 轴旋转 30 度)
通过这组变换,原本存在于抽象空间的顶点数据,被赋予了真实世界的位置、大小和朝向。就像将建筑模型从设计图纸(局部坐标系)放置到城市规划沙盘(世界坐标系)中,每个模型都有了具体的空间定位。
视图矩阵(View Matrix)—— 观察者视角的建立
视图矩阵模拟了相机(观察者)的位置和朝向,定义了 “我们能看到什么”。它通过反向变换,将世界坐标系中的物体转换到相机坐标系。可以类比为:当我们在现实中调整观察位置(比如向左移动 2 米)或转动视角(抬头看天花板)时,视觉范围内的物体布局会相应改变。在图形渲染中,视图矩阵决定了哪些物体位于相机视野内,以及它们的相对位置关系,是实现场景裁剪和视角变换的基础。
投影矩阵(Projection Matrix)—— 三维到二维的视觉映射
投影矩阵完成从三维世界到二维屏幕的关键转换,模拟人类视觉的投影特性。它有两种主要类型:
正交投影(Orthographic Projection):保持物体各部分比例不变,常用于工程制图(类似蓝图视图)
透视投影(Perspective Projection):模拟真实视觉的近大远小效果,如拍照时仰拍导致的腿部拉长现象。其数学本质是将三维空间中的点映射到视锥体(Frustum),最终压缩到二维裁剪空间。
这个过程类似于将立体场景绘制到平面画布上,投影矩阵定义了 “画布” 的绘制规则,决定了最终图像的透视效果和可视范围。
数据流转的数学本质
顶点数据首先经过模型矩阵变换,从局部坐标系转换到世界坐标系;接着通过视图矩阵,转换到相机坐标系;最后由投影矩阵映射到二维裁剪空间,最终经视口变换(Viewport Transformation)生成屏幕上的像素坐标。这三个矩阵构成了完整的空间变换流水线,如同一条生产线上的三道工序,逐步将抽象的几何描述转化为我们看到的可视化图像。
理解这一体系的核心在于:顶点定义了物体 “是什么样子”,而 MVP 矩阵序列解决了 “在哪里、从什么角度、以什么方式呈现” 的问题,三者共同构成了三维渲染的数学基础。
源码在github