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;
}
更加详细的讲解可以参考官方文档。