从零开始物理引擎(六)- 重构完成与MVP理解

发布于:2025-04-21 ⋅ 阅读:(29) ⋅ 点赞:(0)

完成重构,搭建起物理引擎基础框架,包含碰撞检测与移动方式以及物理量基类。

本篇借助重构进一步探索顶点与MVP矩阵理解(model->view->projection)

重构

Common

该项目以dll形式注入启动项目,主要包含通用操作如全局上下文,配置类,日志以及引擎所需接口如窗口接口,控制台接口,渲染类接口等

Console

控制台实现项目,以dll形式注入,通过实现CommoncreateConsole供主启动类创建出控制台。借助imgui实现

MainWindowUi

窗口实现项目,以dll形式注入,通过实现CommoncreateWindow供主启动类创建出主窗口。借助win32api实现

Renderer

渲染器,由dx11负责渲染,主要封装了dx11渲染操作。通过实现CommoncreateDx11供主启动类创建出渲染器实例。


这里不过多介绍代码实现,主要针对渲染器重构部分详解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


网站公告

今日签到

点亮在社区的每一天
去签到