news 2026/5/1 17:23:02

【OpenMesh】OpenMesh实现增量网格重构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【OpenMesh】OpenMesh实现增量网格重构

【OpenMesh】OpenMesh实现增量网格重构

本文实现的为增量网格重构(incremental remesh)算法思想如下:

  • 接收一个目标边长作为输入;
  • 遍历所有边,边长度大于目标边长的4/3时,认为是长边,将在该边中心点新增点,分割该边,做相应的连接操作;
  • 遍历所有边,若边长度小于目标边长的4/5时,认为是短边,将于邻接边合并;
  • 翻转边,使三角形的内角尽可能的趋近于60,避免钝角;
  • 对模型进行切向平滑操作。
    对上述步骤循环5次左右,即可得到较为均匀的网格。

算法具体实现时使用了OpenMesh库,使用了库中自带的函数,包含split()collapse()flip()smooth()函数。
main()

mesh.request_vertex_status();mesh.request_edge_status();mesh.request_halfedge_status();mesh.request_face_status();EdgeFlipFunc(mesh);doubletargetLength=50;for(inti=0;i<5;i++){EdgeSplitFunc(mesh,targetLength);EdgeColapaseFunc(mesh,targetLength);EdgeFlipFunc(mesh);MeshSmoothFunc(mesh);mesh.garbage_collection();}
  • 需要request_XXXX_status()
  • 首先进行一次flip操作,能提高某些自动生成的网格的质量(如openmesh中构建一个平行四边形,左下角为起点,向右倾斜,这时使用TriMesh_ArrayKernelT的mesh会自动连接点0和2,显然边0-2的三角化方式生成的三角网格质量没有连接1-3的方式好
  • garbage_collection()因未仔细研究,所以尽量都添加上了

EdgeSplitFunc()

voidEdgeSplitFunc(MyMesh&mesh,doubletargetLength){doublemax=targetLength*4/3;MyMesh::EdgeIterEnd(mesh.edges_end());OpenMesh::Vec3d midPt;for(MyMesh::EdgeIter iter=mesh.edges_sbegin();iter!=End;++iter){if(max<(mesh.point((*iter).v0())-mesh.point((*iter).v1())).length()){midPt=(mesh.point((*iter).v0())+mesh.point((*iter).v1()))/2;mesh.split(*iter,(mesh.point((*iter).v0())+mesh.point((*iter).v1()))/2);)/2<<endl;}}mesh.garbage_collection();}
  • 4/3为经验值,
  • 使用MyMesh::EdgeIter End(mesh.edges_end()),而不是iter!=mesh.edges_end(),是为了避免递归的分割长边。一次循环中,只分割当前存在的边,不分割新生成的边。

EdgeColapaseFunc()

voidEdgeColapaseFunc(MyMesh&mesh,doubletargetLength){doublemin=targetLength*4/5;MyMesh::EdgeIterEnd(mesh.edges_end());for(autoiter=mesh.edges_sbegin();iter!=End;++iter){if((*iter).is_boundary()||(*iter).v0().is_boundary()||(*iter).v1().is_boundary())continue;if(min>(mesh.point((*iter).v0())-mesh.point((*iter).v1())).length()){if(mesh.is_collapse_ok((*iter).h0()))mesh.collapse((*iter).h0());if(mesh.is_collapse_ok((*iter).h1()))mesh.collapse((*iter).h1());}}mesh.garbage_collection();}
  • 同split,4/5是经验值
  • 同样为了避免递归合并短边,使用了MyMesh::EdgeIter End(mesh.edges_end());
  • 合并短边时,要求合并的边不是网格边界边,严格的边的两个点也不可以是边界点
  • 合并短边使用的半边结构,带有方向,为避免改变网格拓扑

EdgeFlipFunc()

voidEdgeFlipFunc(MyMesh&mesh){doubleorigin,after;MyMesh::EdgeIter iter;for(iter=mesh.edges_sbegin();iter!=mesh.edges_end();++iter){if(mesh.is_flip_ok(*iter)){origin=(mesh.point((*iter).v0())-mesh.point((*iter).v1())).length();mesh.flip(*iter);after=(mesh.point((*iter).v0())-mesh.point((*iter).v1())).length();if(origin<after)mesh.flip(*iter);}}mesh.garbage_collection();}
  • flip只是简单的判断两种方式边的长度大小,使用短的那一种方式

MeshSmoothFunc()

voidMeshSmoothFunc(MyMesh&mesh){OpenMesh::Smoother::SmootherT<MyMesh>::Component com=OpenMesh::Smoother::SmootherT<MyMesh>::Tangential;OpenMesh::Smoother::SmootherT<MyMesh>::Continuity con=OpenMesh::Smoother::SmootherT<MyMesh>::C0;OpenMesh::Smoother::JacobiLaplaceSmootherT<MyMesh>smoother(mesh);smoother.initialize(com,con);smoother.smooth(5);}
  • 需要使用切向平滑,带有法向的平滑会使网格变成处在一个平面

参考文献

  • Botsch M , Kobbelt L . A Remeshing Approach to Multiresolution Modeling[C]// Second Eurographics Symposium on Geometry Processing, Nice, France, July 8-10, 2004. 2004. http://www.graphics.rwth-aachen.de/media/papers/remeshing1.pdf
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 4:55:52

数字图像处理篇---拉普拉斯锐化

我用人人都能懂的方式解释拉普拉斯锐化。一句话核心思想拉普拉斯锐化 “让边缘发光”它是一种数学上的“边缘探测器”&#xff0c;通过强调像素之间的差异来让轮廓更清晰。一、最生活化的比喻想象你在看一幅略微失焦的铅笔画&#xff0c;线条有点模糊。拉普拉斯锐化就像一支“…

作者头像 李华
网站建设 2026/4/30 21:06:21

Jedis线程不安全问题

1. 为什么 Jedis 是线程不安全的&#xff1f; Jedis 实例在多线程环境下是线程不安全的。其根本原因在于 Jedis 的底层实现&#xff1a; 共享 Socket 连接&#xff1a;Jedis 内部维护了一个唯一的 Socket 连接和对应的输入/输出流&#xff08;InputStream/OutputStream&#…

作者头像 李华
网站建设 2026/4/25 11:16:49

数据中心如何赢得社区信任的九大策略

美国各地社区对AI规模数据中心的快速扩张日益警惕。在拥挤的公开听证会上&#xff0c;居民质疑不断上涨的水电费和本地基础设施的压力&#xff0c;越来越多的项目面临延迟或被拒。2025年12月&#xff0c;亚利桑那州钱德勒市就发生了一起典型事件&#xff0c;尽管前美国参议员进…

作者头像 李华
网站建设 2026/5/1 7:21:48

5年测试被裁,恶补3个月上岸阿里25K,面试差点被问哭···

我的个人背景非常简单&#xff0c;也可以说丝毫没有亮点。 学历普通&#xff0c;计算机专业二本毕业&#xff0c;毕业后出来就一直在一家小公司&#xff0c;岁月如梭细&#xff0c;算了下至今从事软件测试已经5年了&#xff0c;也点点点了五年&#xff0c;每天都是重复的工作&…

作者头像 李华