2012-04-24 44 views
0

任何人都可以請幫忙。XNA中的立方體表面正常

我有一個3DS Max製作的立方體。我不知道立方體的尺寸。有沒有辦法獲得立方體的每個面的三角形的頂點?我試圖讓法線的其中一個面的法線來確定它的指向。所以如果我可以確定頂點,我可以得到面的法線,如果我有3個頂點,V1,V2和V3,按照逆時針順序排列,我可以通過計算(V2 - V1)x(V3 - V1),其中x是兩個向量的叉積。

我都對着我的模型.FBX文件,我可以看到一些值,顯示爲: 頂點:* 24 { 一個:-15,-12.5,0,15,-12.5,0,-15 ,12.5,0,15,12.5,0,-15,-12.5,0.5,15,-12.5,0.5,-15,12.5,0.5,15,12.5,0.5}

PolygonVertexIndex:* 36 { a:0,2,-4,3,1,-1,4,5,-8,7,6,-5,0,1,-6,5,4,-1,1,3, - 8,7,5,-2,3,2,-7,6,7,-4,2,0,-5,4,6,-3}

這些是我的模型頂點嗎? 此外,我會假設頂點: * 將是我的頂點列表,但爲什麼只有24?如果一個立方體沒有36個頂點?最後,如果我的頂點的座標是PolygonVertexIndex: * 當我想象這些尺寸在我的腦海中的立方體時,

或者,是否有自動獲取立方體頂點的方法,而無需手動輸入每個頂點的所有值?我可能有一對夫婦的車型

任何幫助,將不勝感激

+0

頂點是三角形之間共享的,所以這就是爲什麼你有24甚至更少。你有三十六個是三角形數組中的條目,每個連續3個指示定義每個三角形的頂點的索引。 – Elideb 2012-04-25 09:08:53

回答

1

我想不通,爲什麼你需要的......因爲當你加載一個模型,可以計算,國內每個頂點將有正常,...

反正它很容易calc下...

前三個索引定義一個面的第一個三角形,接下來三個,一臉的另一三角形。

你只需要一個三角形來計算正常...

與三個指標

因此獲得了veretex陣列和拿到三分...... A,B和C

現在你是正常的由該頂點形成的兩個向量之間的叉積的結果。

Vector3 Normal = Vector3.Cross(B-A, C-B); 

如果正常返回或前進將取決於A,B,C級,可逆時針或順時針旋轉,但模型的每個三角形都會以某種方式進行排序。所以你會嘗試並修復它

0

你可以編寫一個XNA程序,讀取你的法線沒有太多的麻煩。

但是,如果您仍想計算它們,請使用此FF代碼(取自FFWD)作爲指南。查看網址以獲得更多關於利弊的詳細討論。就我個人而言,我對結果並不滿意,但暫時還是有效的。當然,由於此代碼與FFWD相關(Unity XNA的API實現),它與XNA完全不匹配,但數學保持不變。

/// <summary> 
    /// Recalculates the normals. 
    /// Implementation adapted from http://devmaster.net/forums/topic/1065-calculating-normals-of-a-mesh/ 
    /// </summary> 
    public void RecalculateNormals() 
    { 
     Vector3[] newNormals = new Vector3[_vertices.Length]; 

     // _triangles is a list of vertex indices, 
     // with each triplet referencing the three vertices of the corresponding triangle 
     for (int i = 0; i < _triangles.Length; i = i + 3) 
     { 
      Vector3[] v = new Vector3[] 
      { 
       _vertices[_triangles[i]], 
       _vertices[_triangles[i + 1]], 
       _vertices[_triangles[i + 2]] 
      }; 

      Vector3 normal = Vector3.Cross(v[1] - v[0], v[2] - v[0]); 

      for (int j = 0; j < 3; ++j) 
      { 
       Vector3 a = v[(j+1) % 3] - v[j]; 
       Vector3 b = v[(j+2) % 3] - v[j]; 
       float weight = (float)Math.Acos(Vector3.Dot(a, b)/(a.magnitude * b.magnitude)); 
       newNormals[_triangles[i + j]] += weight * normal; 
      } 
     } 

     foreach (Vector3 normal in newNormals) 
     { 
      normal.Normalize(); 
     } 

     normals = newNormals; 
    }