スポンサーリンク

| キーワード:,

VCG Library メッシュからfaceのみを削除する

メッシュの定義

#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> > {
};

faceのみ削除

  //メッシュ定義
  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()

とすると、削除する前の三角形の数を取得することになる。この

mesh.FN() != mesh.face.size()

という状況がVCGできにはまずいので、一連の処理が終わったらCompactFaceVectorを必ず呼び出す必要がある。

結果

VCG Library メッシュからfaceのみを削除する

VCG LibraryのBall Pivotingでメッシュ生成

VCG LibraryでkdTree

VCG Library でスムージング

VCG Library ターゲットの周辺のオブジェクトを取得

VCG LibraryでMeshに三角形を登録する方法

VCG Library でポリゴンファイル保存

VCG Libraryで色のついたポリゴンの読み込み・表示

VCG LibのFace-FaceやEdge-Faceなどの関連付け

VCG Library

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: