【OpenMesh】使用自定义属性

原文出处: http://openmesh.org/Documentation/OpenMesh-Doc-Latest/tutorial.html
这个例子展示:
  • 如何添加和移除自定义属性
  • 如何取得和设置自定义属性的值
再上一个例子中我们计算了每一个顶点的重心并将它们保存在Array中。如果我们将数据保存在网格中并由OpenMesh管理数据,这将会跟方便并且不易出错。如果我们连接这样的特性将会很有用。
OpenMesh提供动态的特性,能够连接到每一个网格实体(顶点、边、Halfedge和网格)。我们区分对待自定义属性和标准属性。自定义属性由用户定制并通过成员函数通过Handle访问属性(比如,VertexHandle)。然而标准属性通过特定的成员函数访问,比如vertex poisition由point和顶点Handle访问。
这个例子将会存储重心值在另一个顶点特性中,而不是保存在一个独立的array中。我们定义想要类型的属性handle并注册这个handle:
// this vertex property stores the computed centers of gravity
OpenMesh::VPropHandleT<MyMesh::Point> cogs;
mesh.add_property(cogs);
系统会分配足够的内存来存储与顶点数一样的MyMesh::Point类型的元素,当然,系统也会同步所有顶点的插入和删除操作,通过顶点的属性。
当希望的属性被注册好了,我们可以使用这个属性来计算每一个顶点的重心。
for (vv_it=mesh.vv_iter( v_it ); vv_it; ++vv_it)
{
mesh.property(cogs,v_it) += mesh.point( vv_it );
++valence;
}
mesh.property(cogs,v_it) /= valence;
最终设置新的顶点。
mesh.set_point( v_it, mesh.property(cogs,v_it) );
完整的源码:
#include <iostream>
#include <vector>
// --------------------
#include <OpenMesh/Core/IO/MeshIO.hh>
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
typedef OpenMesh::TriMesh_ArrayKernelT<> MyMesh;
int main(int argc, char **argv)
{
MyMesh mesh;
// check command line options
if (argc != 4) 
{
std::cerr << "Usage: " << argv[0] << " #iterations infile outfile\n";
return 1;
}
// read mesh from stdin
if ( ! OpenMesh::IO::read_mesh(mesh, argv[2]) )
{
std::cerr << "Error: Cannot read mesh from " << argv[2] << std::endl;
return 1;
}
// this vertex property stores the computed centers of gravity
OpenMesh::VPropHandleT<MyMesh::Point> cogs;
mesh.add_property(cogs);
// smoothing mesh argv[1] times
MyMesh::VertexIter v_it, v_end(mesh.vertices_end());
MyMesh::VertexVertexIter vv_it;
MyMesh::Point cog;
MyMesh::Scalar valence;
unsigned int i, N(atoi(argv[1]));

for (i=0; i < N; ++i)
{
for (v_it=mesh.vertices_begin(); v_it!=v_end; ++v_it)
{ 
mesh.property(cogs,v_it).vectorize(0.0f);
valence = 0;

for (vv_it=mesh.vv_iter( v_it ); vv_it; ++vv_it)
{
mesh.property(cogs,v_it) += mesh.point( vv_it );
++valence;
}
mesh.property(cogs,v_it) /= valence;
}

for (v_it=mesh.vertices_begin(); v_it!=v_end; ++v_it)
if ( !mesh.is_boundary( v_it ) )
mesh.set_point( v_it, mesh.property(cogs,v_it) );
}
// write mesh to stdout
if ( ! OpenMesh::IO::write_mesh(mesh, argv[3]) )
{
std::cerr << "Error: cannot write mesh to " << argv[3] << std::endl;
return 1;
}
return 0;
}

你可能感兴趣的:(【OpenMesh】使用自定义属性)