2017-01-17 4 views
0

私は10億ボクセル以上の1024 x 1024 x 1024のボクセルマップを持っており、XYZ軸からそれらを走査してその中のスキャンの概要を見いだしています。最も簡単なメッシュファイル形式で四角形を書くには?

私はボクセルの境界線に当たるたびに、4つの頂点と三角形/クワッド参照インデックスで構成される顔の四辺形リファレンスを作成します。

結果が50〜6000万のクワッドなので、私はメモリに配列を書き込んでループを使って頂点をマージすることはできないと思います。メモリが大きすぎるため、Meshlabを使って重複する頂点を削除できます。

境界線をたどるたびに4つの頂点とその参照を書き込むのは簡単です。

A /別の方法を使用できますか?

B /何のファイル形式などのファイルストリームラインに私を可能にする:私がobj、プライとSTLファイル形式を研究してきました

FORMAT= .EASY 

vtxA: (2.0 , 5.0, 2,0) nml(-1,0,0) 
vtxB: (2.0 , 6.0, 2,0) nml(-1,0,0) 
vtxC: (2.0 , 5.0, 3,0) nml(-1,0,0) 
vtxD: (2.0 , 6.0, 3,0) nml(-1,0,0) 
QUAD: ABCD 

vtxC: (1002.0 , 5.0, 2,0) nml(1,0,0) 
vtxD: (1002.0 , 6.0, 2,0) nml(1,0,0) 
vtxE: (1002.0 , 5.0, 3,0) nml(1,0,0) 
vtxF: (1002.0 , 6.0, 3,0) nml(1,0,0) 
QUAD: CDEF 
+0

なぜメッシュをスライスから作成しないのですか?最後と実際のスライス円周ポリゴンを覚えておく必要があります。スライス「i-th」ポリゴンが終了したら、(i-1)番目のポリゴンで一致を見つけてQUADを形成し、それらをメッシュに追加します。頂点とインデックスを別々のファイルに保存することができます。メッシュ全体がマージ/パックして3D形式に保存すると、サポートしています...可能であれば、QUADの代わりにTRIANGLE_STRIPを使用してください。 – Spektre

+0

こんにちはスペック良いアイデア、私はその論理的な結果に向かって傾いていた、それは間違いなく簡単です。 –

+0

関連するQAを見てください[シームレスな3Dメッシュを作成するために2つの平行な2次元ポリゴンを接続するにはどうすればいいですか?](http://stackoverflow.com/q/25070206/2521214)スライスは非常によく似ていなければならないおそらくそれよりずっと単純です。 – Spektre

答えて

0

、ストレートディスクに大腿四頭筋を書き込むための最も簡単な1でもSTLのようですそれは三角ですが、ディスクに書込みを書くことができるので、配列の必要はありません。実験室での迅速な修正に適しています。ここで

キューブの例である:コード上に書き込むため

solid cube 
    facet normal 0 0 0 
    outer loop 
     vertex 0 0 0 
     vertex 0 1 0 
     vertex 1 1 0 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 0 0 0 
     vertex 1 1 0 
     vertex 1 0 0 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 0 0 0 
     vertex 0 0 1 
     vertex 0 1 1 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 0 0 0 
     vertex 0 1 1 
     vertex 0 1 0 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 0 0 0 
     vertex 1 0 0 
     vertex 1 0 1 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 0 0 0 
     vertex 1 0 1 
     vertex 0 0 1 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 0 0 1 
     vertex 1 0 1 
     vertex 1 1 1 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 0 0 1 
     vertex 1 1 1 
     vertex 0 1 1 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 1 0 0 
     vertex 1 1 0 
     vertex 1 1 1 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 1 0 0 
     vertex 1 1 1 
     vertex 1 0 1 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 0 1 0 
     vertex 0 1 1 
     vertex 1 1 1 
    endloop 
    endfacet 
    facet normal 0 0 0 
    outer loop 
     vertex 0 1 0 
     vertex 1 1 1 
     vertex 1 1 0 
    endloop 
    endfacet 
endsolid cube 

Cタイプコード:

function Xquad(X:float , Y:float , Z:float , cnt:float){ 

//based on stl cube 

    qstr+="facet normal " +"0 0 0"+ "\n"+ 
    "outer loop\n"+ 
     "vertex "+st(X) +" "+ st(Y) +" "+ st(Z)+ "\n"+ 
     "vertex "+st(X) +" "+ st(Y+1) +" "+ st(Z)+ "\n"+ 
     "vertex "+st(X) +" "+ st(Y+1) +" "+ st(Z+1)+ "\n"+ 
    "endloop\n" + 
"endfacet\n"+ 
    "facet normal " +"0 0 0"+ "\n"+ 
    "outer loop\n"+ 
     "vertex "+st(X) +" "+ st(Y) +" "+ st(Z)+ "\n"+ 
     "vertex "+st(X) +" "+ st(Y+1)+" "+ st(Z+1)+ "\n"+ 
     "vertex "+st(X) +" "+ st(Y) +" "+ st(Z+1)+ "\n"+ 
    "endloop\n"+ 
    "endfacet\n"; 

} 
function Yquad(X:float , Y:float , Z:float , cnt:float){ 

    qstr+="facet normal " +"0 0 0"+ "\n"+ 
    "outer loop\n"+ 
     "vertex "+st(X) +" "+ st(Y) +" "+ st(Z)+ "\n"+ 
     "vertex "+st(X+1)+" "+ st(Y) +" "+ st(Z)+ "\n"+ 
     "vertex "+st(X+1)+" "+ st(Y) +" "+ st(Z+1)+ "\n"+ 
    "endloop\n" + 
"endfacet\n"+ 
    "facet normal " +"0 0 0"+ "\n"+ 
    "outer loop\n"+ 
     "vertex "+st(X) +" "+ st(Y) +" "+ st(Z)+ "\n"+ 
     "vertex "+st(X+1)+" "+ st(Y) +" "+ st(Z+1)+ "\n"+ 
     "vertex "+st(X) +" "+ st(Y) +" "+ st(Z+1)+ "\n"+ 
    "endloop\n"+ 
    "endfacet\n"; 

} 
function Zquad(X:float , Y:float , Z:float , cnt:float){ 

    qstr+="facet normal " +"0 0 0"+ "\n"+ 
    "outer loop\n"+ 
     "vertex "+st(X) +" "+ st(Y) +" "+ st(Z)+ "\n"+ 
     "vertex "+st(X) +" "+ st(Y+1) +" "+ st(Z)+ "\n"+ 
     "vertex "+st(X+1)+" "+ st(Y+1) +" "+ st(Z)+ "\n"+ 
    "endloop\n" + 
"endfacet\n"+ 
    "facet normal " +"0 0 0"+ "\n"+ 
    "outer loop\n"+ 
     "vertex "+st(X) +" "+ st(Y) +" "+ st(Z)+ "\n"+ 
     "vertex "+st(X+1) +" "+ st(Y+1) +" "+ st(Z)+ "\n"+ 
     "vertex "+st(X+1) +" "+ st(Y) +" "+ st(Z)+ "\n"+ 
    "endloop\n"+ 
    "endfacet\n"; 

} 
+1

は、ルールを巻くかもしれません... 'fn'によって最後の' f 5 1 4 8'を意味するなら 'f 8 4 1 5'に変更しようとすると助かります...すべての波面objローダー'v'と' f'行が混在するのをサポートしていますが、すべての処理が終わったら後処理をして2つのファイルを分けることができますが、 'f'の最初のファイルと' v'のファイルの2つを作成します全体のメッシュは2つを併合しました – Spektre

0

IバイナリSTL、クワッドごとに2つのtringlesを使用します。詳細情報はこちらhttps://en.m.wikipedia.org/wiki/STL_(file_format)

+0

STLは巨大なメッシュを作るインデックスを使用しません...一方、バイナリSTLバージョンは高速に読み込むことができます(あまりにも粗すぎない場合) – Spektre

0

おそらく必要な情報を保存することができます。あなたのアプローチでは、以前のクワッドで使用されている頂点の情報を格納するだけです。クワッドはファイルに書き込むことができるので、メモリに保存する必要はありません。

グリッド内に1025x1025x1025(〜= 1G)の頂点があり、頂点はグリッド座標の三つ組で識別できます(x, y, z)、ここでは0 <= x, y, z <= 1024です。頂点は、それが頂点のアレイ内の頂点のインデックスを取得よりも使用される場合、情報を格納するため

標準的な方法は、(ファイルに書き込まれている。):頂点の頂点インデックスに(x, y, z)座標マップ

  • マップ。マップペアは、座標(3 x int16)と頂点インデックス(< = 1G)に4バイトのメモリを必要とします。マップには、1つのマッピングにつき、少数のポインタが必要です。私はあなたの必要性のために< 2GBのメモリである各頂点のために30バイト未満を使用するようにマップを実装できると思います。

  • すべての可能な頂点の頂点インデックスを格納する頂点グリッドサイズ(1025^3)の3D配列。頂点が実際の頂点インデックスよりも使用された場合、頂点が使用されなかった場合は-1(またはその他のフラグ)。マップよりも簡単な実装。 〜4GBのメモリが必要ですが、問題はありません。

関連する問題