MeshSimp 是一个基于 C++ 和 OpenGL 的网格简化工具。它实现了 SIGGRAPH '97 上提出的二次误差度量 (Quadric Error Metrics, QEM) 算法,并使用现代化的数据结构和工具进行优化。
项目提供 CLI (命令行) 和 GUI (实时交互) 两个版本,分别满足快速处理与算法演示的需求。CLI版用于快速生成目标简化模型,当前在 AMD 5800X 处理器 + WSL 上简化速度可达 ~580k face/s;GUI版支持简化过程的实时可视化,允许用户交互式地控制简化过程,自由角度观察网络拓扑结构的变化。
- 核心算法 : 完整复现 SIGGRAPH '97 的 QEM 边收缩算法,能够较好地保持模型的高曲率几何特征。
- 边界保持 : 对于开放网格 (如地形、面具) 的边缘施加高权重惩罚,防止边界提前退化
- 面翻转检查 : 检测简化前后面法线的变化,防止面翻转等情况发生产生自交或非流形结构
- 性能优化 : 针对原始
Vertex和Face存储结构,尚未使用半边结构。- 优先队列懒删除 : 引入基于顶点的时间戳 (Timestamp) 机制,避免昂贵的堆更新操作,且适配 C++ STL 结构
- 自适应垃圾回收 : 动态检测优先队列中无效元素比例,自动触发清理和重构,控制内存占用;清理过程通过继承 Hack C++ STL 获取内部容器,从而支持 O(N) 清理和原地重建堆,使垃圾回收操作成为正优化
- 特殊数据结构维护 : 顶点邻接面
vi2fis,减少冗余面边访问 - 网格数据懒删除 : 仅标记简化过程中去除的顶点和退化的面,导出模型时才做最终的压缩;适配 OpenGL 显示,仅向 VBO 和 EBO 更新必要变化
- 双模式支持 : CLI 版和 GUI 版。
- GUI 交互模式 : 基于 OpenGL 的实时可视化界面,使用 float 单精度计算,支持网格模型选择加载、简化率调整、简化面数动态显示、简化过程暂停/恢复/重置/单步执行、简化结束Error显示、简化模型导出、Trackball 相机视角观察等功能。适合演示和算法调试。
- CLI 命令行模式 : 去除图形渲染开销,专注算法执行本身,使用 double 双精度计算,提供毫秒级的初始化与简化过程耗时统计。适合批量处理与性能基准测试。
环境依赖
- CMake 3.17+
- C++ 17 编译器
- OpenGL 3.3+
- OpenMP (非核心,可关)
第三方依赖:已于 CMake 中处理
- GLFW 3.4
- GLM 1.0.2
- ImGUI v1.92.5
- tinyobjloader (commit_id = a4e519b0a)
- glad
系统平台
- Unix Like: 已于 WSL - Ubuntu 22.04 中验证
- Windows: 使用 MinGW 工具链验证,可构建,存在问题
- 目前 Release 模式构建运行时会莫名崩溃,Debug 模式构建可运行
以 Ubuntu 22.04 为例
# 克隆仓库
git clone --recursive [email protected]:Xlucidator/MeshSimp.git
git submodule update --init --recursive # 若上一步忘加 --recursive
cd MeshSimp
# 编译构建
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j$(nproc)## CLI 模式
# 用法: ./MeshSimp-CLI <输入文件> <输出文件> <简化比例>
./MeshSimp-CLI ../assets/object/Arma.obj Arma_simp.obj 0.01
## GUI 模式
# 用法: ./MeshSimp-GUI 后面按顺序接任意数量参数均可,会自动填入GUI显示内容中
./MeshSimp-GUI
./MeshSimp-GUI ../assets/object/Buddha.obj
./MeshSimp-GUI ../assets/object/Buddha.obj Buddha_simp-0.05.obj基本流程:点击 Load 加载模型
相机操作:按住左键滑动鼠标 - 移动物体;按住右键滑动鼠标 - 旋转物体;滚动滚轮 - 缩放/改变距离
测试结果来自 scripts/benchmark.py ,该脚本使用事先生成的 MeshSimp-CLI 批量简化 assets/object/ 下所有模型(除 Cube.obj ,其面数过少),统计运行数据并生成结果。测试用 MeshSimp-CLI 开启了 PERF_TEST 宏,该宏关闭了简化循环中的消息输出,可大幅加速简化过程。
下图的简化结果统一设置简化率为 0.2
- Garland, M., & Heckbert, P. S. (1997). Surface simplification using quadric error metrics. SIGGRAPH '97.

