ぬの部屋(仮)
nu-no-he-ya
  •   12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
         12
    3456789
    10111213141516
    17181920212223
    242526272829 
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
        123
    45678910
    11121314151617
    18192021222324
    25262728   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    15161718192021
    293031    
           
         12
    3456789
    10111213141516
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728     
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
          1
    2345678
    9101112131415
    16171819202122
    232425262728 
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
  • VCG Library

    1.ダウンロード

    以下の、Clone or downloadからVCG Libraryをダウンロードする。

    https://github.com/cnr-isti-vclab/vcglib/

    2.Includeする

    //基本的なデータタイプ
    #include <vcg/complex/complex.h>
    // PLYファイルの入出力
    #include <wrap/io_trimesh/import_ply.h>
    #include <wrap/io_trimesh/export_ply.h>
    

    3.基本的なデータ型を作成

    vcg::Vertex,vcg::Faceなどの既存型があるが、それらを継承した型を使うのが方針らしい。

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

    4.PLYファイルを読み込む例

    エッジ情報などはデフォルトでは計算してくれないので、UpdateTopologyのAllocateEdgeなどで作成する

    //メッシュデータオブジェクト
    MyMesh mesh;
    int main(int argc, char **argv)
    {
    
      //plyファイル読み込み
      vcg::tri::io::ImporterPLY<MyMesh>::Open(mesh, "data.ply");
    
      //面法線計算
      vcg::tri::UpdateNormal<MyMesh>::PerFace(mesh);
    
      //Triangleのエッジ情報を作成
      vcg::tri::UpdateTopology<MyMesh>::AllocateEdge(mesh);
    
      //縮尺
     // meshオブジェクトがbboxメンバ(Bounding Box)を持っているので、
      // モデルの最大・最小の座標がわかる
      double scalex = 1.0 / (mesh.bbox.max.X() - mesh.bbox.min.X());
      double scaley = 1.0 / (mesh.bbox.max.Y() - mesh.bbox.min.Y());
      double scalez = 1.0 / (mesh.bbox.max.Z() - mesh.bbox.min.Z());
    
      double scale = (std::min)((std::min)(scalex, scaley), scalez);
    
      //センタリング
      double offsx = mesh.bbox.min.X() + (mesh.bbox.max.X() - mesh.bbox.min.X()) / 2;
      double offsy = mesh.bbox.min.Y() + (mesh.bbox.max.Y() - mesh.bbox.min.Y()) / 2;
      double offsz = mesh.bbox.min.Z() + (mesh.bbox.max.Z() - mesh.bbox.min.Z()) / 2;
    

    5.表示

    全ての三角形はmeshオブジェクト内のface配列に格納されている。

    //三角形で表示
    void disp_triangles() {
    
      //マテリアルの設定
      glMaterialfv(GL_FRONT, GL_AMBIENT, material_ambient);
      glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular);
    
      glEnable(GL_LIGHTING);
    
      glMaterialfv(GL_FRONT, GL_DIFFUSE, material_diffuse_w);
      //描画処理本体
      // mesh.face[0].N で面法線
      // mesh.face[0].V(0)->C.X() で三角形の第一頂点のR
      // mesh.face[0].V(0)->P().X() で三角形の第一頂点のx座標
     // * cがついているのはconstの意味
      glBegin(GL_TRIANGLES);
      for (const auto& f : mesh.face) {
        glNormal3d(f.cN().X(), f.cN().Y(), f.cN().Z());
        for (size_t i = 0; i < 3; i++) {
          glColor3ub(f.cV(i)->cC().X(), f.cV(i)->cC().Y(), f.cV(i)->cC().Z());
          glVertex3d(f.cV(i)->cP().X(), f.cV(i)->cP().Y(), f.cV(i)->cP().Z());
        }
    
      }
      glEnd();
    }
    //三角形のエッジを表示
    void disp_edge() {
    
      glDisable(GL_LIGHTING);
    
      glColor3d(1, 0, 0);
      glBegin(GL_LINES);
      for (const auto& e : mesh.edge) {
        glVertex3d(e.cV(0)->cP().X(), e.cV(0)->cP().Y(), e.cV(0)->cP().Z());
        glVertex3d(e.cV(1)->cP().X(), e.cV(1)->cP().Y(), e.cV(1)->cP().Z());
      }
      glEnd();
    }
    

    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