vcglib实例
先给出MyMesh
// define mesh type
class Vertex; class Edge; class Face;
struct UsedTypes : public vcg::UsedTypes<
vcg::Use<Vertex>::AsVertexType,
vcg::Use<Edge> ::AsEdgeType,
vcg::Use<Face> ::AsFaceType > {};
class Vertex : public vcg::Vertex<UsedTypes, vcg::vertex::Qualityf, vcg::vertex::Color4b, vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::VFAdj, vcg::vertex::Mark, vcg::vertex::BitFlags> {};
class Face : public vcg::Face< UsedTypes, vcg::face::VertexRef, vcg::face::Normal3f, vcg::face::FFAdj, vcg::face::VFAdj, vcg::face::Mark, vcg::face::BitFlags> {};
class Edge : public vcg::Edge< UsedTypes, vcg::edge::VertexRef> {};
class Mesh : public vcg::tri::TriMesh< std::vector<Vertex>, std::vector<Face>, std::vector<Edge> > {};
vcg导出Quality
vcg默认的格式off不支持quality属性
但ply格式支持quality属性但要加
vcg::tri::io::ExporterPLY<Mesh>::Save(m1,“x.ply", io::Mask::IOM_VERTQUALITY);
添加线属性
vcg::tri::UpdateTopology::AllocateEdge(m);
在meshlab中输出log
MeshLabInterface::Log(“xx”);
遍历顶点一邻域
点和面都需要AFadjacent结构
RequireVFAdjacency(m);
vcg::tri::UpdateTopology<MyMesh>::VertexFace(m);
vcg::face::VFIterator<MyFace> vfi(v);
for (; !vfi.End(); ++vfi)
{
MyFace* f = vfi.F();
for (int i = 0; i < 3; ++i)
{
f->V(i)->SetV();
}
}
其中vfi是顶点v周围面的数组的第一个元素的指针,for循环遍历包含顶点v的所有面。
自己定义顶点属性
自己定义每个顶点的索引
MyMesh::PerVertexAttributeHandle<int> vIndex = vcg::tri::Allocator<MyMesh>::GetPerVertexAttribute<int>(m,std::string("Vertex Index"));
给顶点赋颜色
class MyVertex : public vcg::Vertex<MyUsedTypes,vcg::vertex::Color4b, vcg::vertex::Coord3f > {};
for (MyMesh::VertexIterator vi = m.vert.begin(); vi != m.vert.end(); ++vi)
{
// Shander configuretion
MyMesh::VertexType::ColorType& colorV = vi->C();
colorV = vcg::Color4b::Black;
}
vcg::tri::io::ExporterOFF<MyMesh>::Save(mOut, "output.off", 4);
给face赋颜色
注意Myface要有vcg::face::Color4b
属性
class MyFace : public vcg::face::VertexRef, vcg::face::Color4b > {};
for (int i = 0; i < faces.size(); ++i)
{
mOut.face[i].C() = vcg::Color4b::Black;
}
vcg::tri::io::ExporterOFF<MyMesh>::Save(mOut, "output.off", vcg::tri::io::Mask::IOM_FACECOLOR);
vcg详细介绍
http://www.doc88.com/p-9005336574343.html
计算曲率
注意在计算曲率之前要去除非流形面,不然程序崩溃
const int nDuplicateFaces = vcg::tri::Clean<MyMesh>::RemoveDuplicateFace(m);
vcg::tri::UpdateCurvatureFitting<MyMesh>::computeCurvature(m);
简化
注意计算简化后可能存在非流行,删除非流行face后还要补洞。