Skip to content

A high-performance C++ implementation of Mesh Simplification using Quadric Error Metrics with real-time OpenGL visualization

License

Notifications You must be signed in to change notification settings

Xlucidator/MeshSimp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MeshSimp : 基于QEM的交互式网格简化系统

MeshSimp 是一个基于 C++ 和 OpenGL 的网格简化工具。它实现了 SIGGRAPH '97 上提出的二次误差度量 (Quadric Error Metrics, QEM) 算法,并使用现代化的数据结构和工具进行优化。

项目提供 CLI (命令行) 和 GUI (实时交互) 两个版本,分别满足快速处理与算法演示的需求。CLI版用于快速生成目标简化模型,当前在 AMD 5800X 处理器 + WSL 上简化速度可达 ~580k face/s;GUI版支持简化过程的实时可视化,允许用户交互式地控制简化过程,自由角度观察网络拓扑结构的变化。

MeshSimp-GUI演示

核心特色

  • 核心算法 : 完整复现 SIGGRAPH '97 的 QEM 边收缩算法,能够较好地保持模型的高曲率几何特征。
    • 边界保持 : 对于开放网格 (如地形、面具) 的边缘施加高权重惩罚,防止边界提前退化
    • 面翻转检查 : 检测简化前后面法线的变化,防止面翻转等情况发生产生自交或非流形结构
  • 性能优化 : 针对原始 VertexFace 存储结构,尚未使用半边结构。
    • 优先队列懒删除 : 引入基于顶点的时间戳 (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 加载模型 $\to$ 拖动滑块调整化简 Ratio $\to$ 点击 Initialize 创建简化器 $\to$ 点击 Resume 开始化简 $\to$ 点击 Export 导出模型

相机操作:按住左键滑动鼠标 - 移动物体;按住右键滑动鼠标 - 旋转物体;滚动滚轮 - 缩放/改变距离

性能表现

测试结果来自 scripts/benchmark.py ,该脚本使用事先生成的 MeshSimp-CLI 批量简化 assets/object/ 下所有模型(除 Cube.obj ,其面数过少),统计运行数据并生成结果。测试用 MeshSimp-CLI 开启了 PERF_TEST 宏,该宏关闭了简化循环中的消息输出,可大幅加速简化过程。

下图的简化结果统一设置简化率为 0.2

性能测试

参考文献

  1. Garland, M., & Heckbert, P. S. (1997). Surface simplification using quadric error metrics. SIGGRAPH '97.

About

A high-performance C++ implementation of Mesh Simplification using Quadric Error Metrics with real-time OpenGL visualization

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published