OPENMESH学习(1)

OPENMESH官方文档学习

网格处理的开源函数库的英文官方文档链接:半边数据结构官方文档
openmesh开源库是用于进行网格处理的重要函数库,其采用半边数据结构来存储网格信息和网格拓扑结构。
半边数据结构中的三种数据类型:顶点(vertex),半边(halfage),面(face)。
半边数据结构的详细介绍,建议参考文章:https://blog.csdn.net/outtt/article/details/78544053
openmesh中的数据访问:迭代器(iterator)以及循环器(Circulators)
1、迭代器可以用来遍历网格模型中的点,半边,边,面。

遍历顶点(vertex),半边(halfedge),面(face),边(edge)的方法如下:

typedef  OpenMesh::Iterators::VertexIterT<MyMesh>   MyMesh
MyMesh mesh;
// iterate over all vertices
for (MyMesh::VertexIter v_it=mesh.vertices_begin(); v_it!=mesh.vertices_end(); ++v_it) 
   ...; // do something with *v_it, v_it->, or *v_it
// iterate over all halfedges
for (MyMesh::HalfedgeIter h_it=mesh.halfedges_begin(); h_it!=mesh.halfedges_end(); ++h_it) 
   ...; // do something with *h_it, h_it->, or *h_it
// iterate over all edges
for (MyMesh::EdgeIter e_it=mesh.edges_begin(); e_it!=mesh.edges_end(); ++e_it) 
   ...; // do something with *e_it, e_it->, or *e_it
// iterator over all faces
for (MyMesh::FaceIter f_it=mesh.faces_begin(); f_it!=mesh.faces_end(); ++f_it) 
{
	std::cout << "The face's valence is " << mesh.valence( *f_it ) << std::endl;
}
   ...; // do something with *f_it, f_it->, or *f_it

每一种数据类型同时有常迭代器与其对应,使用时只需将下面的单词与上文中代码块中的对应词替换即可
ConstVertexIter
ConstHalfedgeIter
ConstEdgeIter
ConstFaceIter

注意:如果网格结构中的一个数据元素(点,面等)被删除,使用常规的迭代器,这些被删除的元素依旧会被访问而出现错误。可以使用
OpenMesh::ArrayKernel::garbage_collection()来回收这部分存储空间之后再使用迭代器进行枚举。

*同样可以使用下面的skipping iterators进行遍历:
vertices_sbegin(), 遍历网格中的点
edges_sbegin(), 遍历网格中的边
halfedges_sbegin(), 遍历网格中的半边
faces_sbegin() 遍历网格中的面

2、如何查看一个顶点的领域元素或者面的邻域元素
openmesh中的方法(循环器)如下:

/*枚举点周围邻域元素*/
VertexVertexIter     			// iterate over all neighboring vertices.
VertexIHalfedgeIter  			//iterate over all incoming halfedges.
VertexOHalfedgeIter       		// iterate over all outgoing halfedges.
VertexEdgeIter					//iterate over all incident edges.
VertexFaceIter					// iterate over all adjacent faces.
/*枚举点周围邻域元素*/
FaceVertexIter					// iterate over the face's vertices.
FaceHalfedgeIter				// iterate over the face's halfedges.
FaceEdgeIter					// iterate over the face's edges.
FaceFaceIter					// iterate over all edge-neighboring faces.

在程序中具体操作如下:

MyMesh mesh;
// (linearly) iterate over all vertices
for (MyMesh::VertexIter v_it=mesh.vertices_sbegin(); v_it!=mesh.vertices_end(); ++v_it)
{
  // circulate around the current vertex
  for (MyMesh::VertexVertexIter vv_it=mesh.vv_iter(*v_it); vv_it.is_valid(); ++vv_it)
  {
    // do something with e.g. mesh.point(*vv_it)
  }
}


//对于面来说
MyMesh mesh;
...
// Assuming faceHandle contains the face handle of the target face
MyMesh::FaceHalfedgeIter fh_it = mesh.fh_iter(faceHandle);
for(; fh_it.is_valid(); ++fh_it) {
    std::cout << "Halfedge has handle " << *fh_it << std::endl;
}

更加详细的讲解可以参考官方文档。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值