2012-01-03 9 views
1

私は、STLファイルのインポートに取り組んでおり、私は三角形の巻線順序を決定するために与えられた通常の使用を作るだろうと思っています。以下の4つの三角形のサンプルデータが含まれています(元のデータには70,000以上の三角形があります)。私のコードのロジックは、頂点が反時計回りに指定されていると仮定して法線を計算し、次にこの計算された法線と供給された法線の内積を計算します。結果が肯定的であれば、反時計回り、それ以外は時計回りと仮定する。トライアングルの頂点巻き順(STL)ファイル(三角オブジェクト)

 tm.SetCCW(Dot(Cross(facet.getVertex2() - facet.getVertex1(),facet.getVertex3() - facet.getVertex1()),facet.getNormal()) > 0.0); 

このロジックは、特定の3Dスキャナのファイルセットでは失敗します。 Rhino3Dにこれらのファイルをロードし、 "Dir"を発行して法線方向を見ると、Rhinoは正しい方向を示します。私が試した他のいくつかのSTL視聴者と同じです。

マイコードが頂点がサンプルデータに時計回りの順で供給されていることを推定するが、その巻線順序を使用する場合、モデルが供給される法線が間違っている意味、インサイドアウトです。

これは、STLの輸入業者は、供給され、通常のを無視して、反時計回りの巻線順序を仮定するための規則であるという結論に私をリード。私は、私の前提が正しいかどうかを判断するために、STLファイル形式でより多くの経験を積んだ人を探しています。

solid object_name 
    facet normal -0.651094 0.733745 -0.194150 
     outer loop 
      vertex 30.335684 -40.893806 -68.126500 
      vertex 31.155055 -39.911656 -67.162500 
      vertex 30.263726 -40.702583 -67.162500 
     endloop 
    endfacet 
    facet normal -0.654292 0.732059 -0.189714 
     outer loop 
      vertex 30.335684 -40.893806 -68.126500 
      vertex 31.225185 -40.098797 -68.126500 
      vertex 31.155055 -39.911656 -67.162500 
     endloop 
    endfacet 
    facet normal -0.711866 0.677947 -0.183397 
     outer loop 
      vertex 31.225185 -40.098797 -68.126500 
      vertex 31.980540 -39.044870 -67.162500 
      vertex 31.155055 -39.911656 -67.162500 
     endloop 
    endfacet 
    facet normal -0.714326 0.676343 -0.179716 
     outer loop 
      vertex 31.225185 -40.098797 -68.126500 
      vertex 32.048799 -39.228928 -68.126500 
      vertex 31.980540 -39.044870 -67.162500 
     endloop 
    endfacet 
endsolid 

EDIT:第一の端面のための私の計算:

p1 = {30.335684, -40.893806, -68.126500} 
p2 = {31.155055, -39.911656, -67.162500} 
p3 = {30.263726, -40.702583, -67.162500} 

u = p2 - p1 = {0.819371, 0.98215, 0.964} 
w = p3 - p1 = {-0.071958, 0.191223, 0.964} 

u x w = {0.762454, -0.859241, 0.227356} (calculated normal) 

given normal = {-0.651094, 0.733745, -0.194150} 

calculated_normal <dot> given_normal = -1.17103 

verdict: 90 < theta < 270 where theta is the angle between the calculated and given normals 

答えて

1

頂点がオブジェクトの外側から見たときに頂点が反時計回りの順であるべきです。 (明らかに、オブジェクトの内側から見ると、時計回りの順序になります)。

通常は外向きに指している必要があります。

私は、いくつかのプログラムが正常を無視し、頂点の順序だけで行くことを読んだことがあります。標準では{0.0、0.0、0.0}に設定することを推奨しています。頂点の順序を両方とも使用する必要があります。

通常は、しかし、冗長です。多くのプログラムでは、頂点の順序がすべて必要です。それが一般的にすべてのプログラムに当てはまるかどうかはわかりません。私は両方を正しいものにすることをお勧めします。

+0

ご回答いただきありがとうございます。あなたはSTLファイルの面が反時計回りの順序でなければならないソースを持っていますか?これは、私が遭遇したファイルの90%以上が何であるかのようであり、CCWでなければならないランダムなWebページでも読んでいますが、決してそれを見たことはありません。 – PeteUK

関連する問題