【OpenMesh】一些基本操作:翻转和折叠

本文介绍如何使用OpenMesh库中的函数来实现三角形网格的边翻转及边缘折叠操作。包括具体的C++代码示例,展示了如何添加顶点、面以及翻转和折叠边。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/arthurlr/article/details/9343725


这一节中你将学到一些OpenMesh中早已提供的基础操作。
内容包括三角形网格边的翻转以及通过连接邻接的顶点边缘折叠。

三角形网格的翻转(Flipping edges)

考虑到两个邻接面的三角形网格中存在两种不同内部边缘设置。调用函数OpenMesh::TriConnectivity::flip(EdgeHandle _eh)将翻转特定的边到其相反的方向,如下图所述。


下面的代码段演示了如何在程序中使用这个函数:
  1. TriMesh mesh;  
  2. // Add some vertices  
  3. TriMesh::VertexHandle vhandle[4];  
  4. vhandle[0] = mesh.add_vertex(MyMesh::Point(0, 0, 0));  
  5. vhandle[1] = mesh.add_vertex(MyMesh::Point(0, 1, 0));  
  6. vhandle[2] = mesh.add_vertex(MyMesh::Point(1, 1, 0));  
  7. vhandle[3] = mesh.add_vertex(MyMesh::Point(1, 0, 0));  
  8. // Add two faces  
  9. std::vector<TriMesh::VertexHandle> face_vhandles;  
  10. face_vhandles.push_back(vhandle[2]);  
  11. face_vhandles.push_back(vhandle[1]);  
  12. face_vhandles.push_back(vhandle[0]);  
  13. mesh.add_face(face_vhandles);  
  14. face_vhandles.clear();  
  15. face_vhandles.push_back(vhandle[2]);  
  16. face_vhandles.push_back(vhandle[0]);  
  17. face_vhandles.push_back(vhandle[3]);  
  18. mesh.add_face(face_vhandles);  
  19. // Now the edge adjacent to the two faces connects  
  20. // vertex vhandle[0] and vhandle[2].  
  21. // Find this edge and then flip it  
  22. for(TriMesh::EdgeIter it = mesh.edges_begin(); it != mesh.edges_end(); ++it) {  
  23. if(!mesh.is_boundary(it.handle())) {  
  24. // Flip edge  
  25. mesh.flip(it.handle());  
  26. }  
  27. }  
  28. // The edge now connects vertex vhandle[1] and vhandle[3].  

边缘折叠(Collapsing edges)

这一节中你将学到如何进行边缘折叠比如连接两个邻接顶点。OpenMesh提供函数OpenMesh::PolyConnectivity::collapse(HalfedgeHandle _heh)实现这一功能。这会折叠halfedge的起始顶点(halfedge直接指向的方向)到结束顶点,如下图所述。注意边缘折叠会导致网格拓扑不一致。你应该在边缘折叠之后验证一致性,通过调用OpenMesh::PolyConnectivity::is_collapse_ok()。



简单的代码例子:
  1. PolyMesh mesh;  
  2. // Add some vertices as in the illustration above  
  3. PolyMesh::VertexHandle vhandle[7];  
  4. vhandle[0] = mesh.add_vertex(MyMesh::Point(-1, 1, 0));  
  5. vhandle[1] = mesh.add_vertex(MyMesh::Point(-1, 3, 0));  
  6. vhandle[2] = mesh.add_vertex(MyMesh::Point(0, 0, 0));  
  7. vhandle[3] = mesh.add_vertex(MyMesh::Point(0, 2, 0));  
  8. vhandle[4] = mesh.add_vertex(MyMesh::Point(0, 4, 0));  
  9. vhandle[5] = mesh.add_vertex(MyMesh::Point(1, 1, 0));  
  10. vhandle[6] = mesh.add_vertex(MyMesh::Point(1, 3, 0));  
  11. // Add three quad faces  
  12. std::vector<PolyMesh::VertexHandle> face_vhandles;  
  13. face_vhandles.push_back(vhandle[1]);  
  14. face_vhandles.push_back(vhandle[0]);  
  15. face_vhandles.push_back(vhandle[2]);  
  16. face_vhandles.push_back(vhandle[3]);  
  17. mesh.add_face(face_vhandles);  
  18. face_vhandles.clear();  
  19. face_vhandles.push_back(vhandle[1]);  
  20. face_vhandles.push_back(vhandle[3]);  
  21. face_vhandles.push_back(vhandle[5]);  
  22. face_vhandles.push_back(vhandle[4]);  
  23. mesh.add_face(face_vhandles);  
  24. face_vhandles.clear();  
  25. face_vhandles.push_back(vhandle[3]);  
  26. face_vhandles.push_back(vhandle[2]);  
  27. face_vhandles.push_back(vhandle[6]);  
  28. face_vhandles.push_back(vhandle[5]);  
  29. mesh.add_face(face_vhandles);  
  30. // Now find the edge between vertex vhandle[2]  
  31. // and vhandle[3]  
  32. for(PolyMesh::HalfedgeIter it = mesh.halfedges_begin(); it != mesh.halfedges_end(); ++it) {  
  33. if(to_vertex_handle(it.handle()) == vhandle[3] &&  
  34. from_vertex_handle(it.handle()) == vhandle[2]) {  
  35. // Collapse edge  
  36. mesh.collapse(it.handle());  
  37. break;  
  38. }  
  39. }  
  40. // Our mesh now looks like in the illustration above after the collapsing.  

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值