スポンサーリンク
#pragma once //基本的なデータタイプ #include <vcg/complex/complex.h> class MyFace; class MyVertex; class MyEdge; struct MyUsedTypes : public vcg::UsedTypes< vcg::Use<MyVertex>::AsVertexType, vcg::Use<MyFace>::AsFaceType, vcg::Use<MyEdge>::AsEdgeType> {}; //頂点型 class MyVertex : public vcg::Vertex< MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Color4b, vcg::vertex::Normal3f, vcg::vertex::VFAdj, vcg::vertex::VEAdj, vcg::vertex::Qualityf, vcg::vertex::BitFlags, vcg::vertex::Mark> { //ここにメンバ変数を追加できる }; //面型 class MyFace : public vcg::Face < MyUsedTypes, vcg::face::VertexRef, vcg::face::Normal3f, vcg::face::FFAdj, vcg::face::EFAdj, vcg::face::Mark, vcg::face::VFAdj, vcg::face::BitFlags > { }; //エッジ型 class MyEdge : public vcg::Edge< MyUsedTypes, vcg::edge::VertexRef, vcg::edge::BitFlags, vcg::edge::EVAdj, vcg::edge::EFAdj> { }; //3Dモデル型 class MyMesh : public vcg::tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace>, std::vector<MyEdge> > { };
//メッシュ定義 MyMesh mesh; //PLYファイル読み込み vcg::tri::io::ImporterPLY<MyMesh>::Open(mesh, plypathname); //全てのfaceにDELETEDフラグを立てる for (int i = 0; i < mesh.face.size(); i++) { vcg::tri::Allocator<MyMesh>::DeleteFace(mesh, mesh.face[i]); } // DELETED フラグのついたMyFaceオブジェクトを削除する vcg::tri::Allocator<MyMesh>::CompactFaceVector(mesh);
VCGの三角形の削除は、MyFaceオブジェクトにDELETEDフラグを立てる事で行う。
DeleteFace staticメンバ関数でDELETEDフラグを立てるのだが、この時、対象の三角形(上ではmesh.face[i])に既にDELETEDフラグが立っているとassertで落ちる。まあ既に削除された事になっているモノを操作しようとしているのだから合理的ではあるのだが。
そして、本当の削除はその後CompactFaceVectorで行う。
この時注意は、CompactFaceVectorを使う前も、「内部的には三角形数==0 」 という扱いになっている。だから、
int fc = mesh.FN();
とした場合、fc == 0になる。
ところが
int fc = mesh.face.size()
とすると、削除する前の三角形の数を取得することになる。この
という状況がVCGできにはまずいので、一連の処理が終わったらCompactFaceVectorを必ず呼び出す必要がある。
VCG LibraryのBall Pivotingでメッシュ生成
VCG Library ターゲットの周辺のオブジェクトを取得