2014-02-19 28 views
1

我創建了一個使用C#的飛機,我得到它「工作」我得到一架飛機。但是三角形似乎沒有正確連接,我無法弄清楚爲什麼。創建一個統一的飛機,三角形看起來不正確

正如你可以通過圖片看到,它比我能解釋它更好。

我相信這個問題只是與我的指數,但我不知道。

我想也可能有一個三角形不在那裏,所以我認爲我的數組也因爲某些原因而變小。

Mesh CreatePlane(int width, int depth) 
{ 
    Mesh m = new Mesh(); 
    int numVert=(width+1)*(depth+1); 
    Vector3[] vertecies = new Vector3[numVert]; 
    Vector2[] uvs = new Vector2[numVert]; 
    int[] triangles = new int[width*depth*6]; 

    float uvx = 1.0f/width; 
    float uvy = 1.0f/depth; 
    int index = 0; 


    for (int i = 0;i<width;i++) 
    { 
     for(int j = 0;j<depth;j++) 
     { 
      vertecies[index] = new Vector3(i,0,-j); 
      uvs[index++] = new Vector2(j*uvx,i*uvy); 

     } 
    } 

    index = 0; 
    for(int j=0; j<depth; j++) 
    { 
     for(int i=0; i<width; i++) 
     { 

      triangles[index++] = (j * (width+1)) + i; 
      triangles[index++] = ((j+1) * (width+1)) + i; 
      triangles[index++] = (j * (width+1)) + i + 1; 

      triangles[index++] = ((j+1) * (width+1)) + i; 
      triangles[index++] = ((j+1) * (width+1)) + i + 1; 
      triangles[index++] = (j * (width+1)) + i + 1; 

     } 
    } 

    m.name = "ScriptPlane"; 
    m.vertices = vertecies; 
    m.uv = uvs; 
    m.triangles = triangles; 
    m.RecalculateNormals(); 

    return m; 
} 
+0

請不要包含關於問題標題中使用的語言的信息,除非在沒有它的情況下沒有意義。標籤用於此目的。 –

回答

4

您計算uvx這樣:

float uvx = 1.0f/width; 

然後你循環在寬度上是這樣的:

for (int i = 0;i<width;i++) 
{ 
    for(int j = 0;j<depth;j++) 
    { 
     vertecies[index] = new Vector3(i,0,-j); 
     uvs[index++] = new Vector2(j*uvx,i*uvy); 
    } 
} 

如果你看看密切,有2個錯誤:

  • j乘以uvx,但它從0depth(應該不是width?);
  • 您需要循環最多包含widthdepth(使用<= width< width + 1)。

這些只是UV座標,不要保留頂點在那個循環中。它不會解決你的問題,但只是你後來會注意到的那兩個錯誤。

爲了解決這個問題的三角形試試這個:

0 +--+ 2  + 2 
    |/  /| 
    |/  /| 
1 +  1 +--+ 3 

0 -> 1 -> 2 
2 -> 1 -> 3 

這一點很重要,你命令他們的背面剔除正常工作逆時針旋轉。 您可以使用任何其他順序,有一些非常聰明的解決方案可以切換對角線並保持鄰接關係,這是優化網格緩衝區的較舊硬件所必需的。較新的硬件將即時完成這些優化,而不需要您進行數學計算。

訂購如上圖所示的三角形緩衝三角形:

b = (j * width + i) * 6; 
triangles[index++] = b + 0; 
triangles[index++] = b + 1; 
triangles[index++] = b + 2; 

triangles[index++] = b + 2; 
triangles[index++] = b + 1; 
triangles[index++] = b + 3; 

此時你需要做的就是位置的頂點正確。你張貼了這個:

vertecies[index] = new Vector3(i,0,-j); 

相反,你應該在一個單獨的循環做到這一點

bx = i; 
by = -j; 
vertecies[index++] = new Vector3(bx + 0, 0, by - 1); // 0 
vertecies[index++] = new Vector3(bx + 0, 0, by - 0); // 1 
vertecies[index++] = new Vector3(bx + 1, 0, by - 1); // 2 
vertecies[index++] = new Vector3(bx + 1, 0, by - 0); // 3 

我也看到你換yz,這將引起頭痛。此外,您還針對世界空間座標倒轉了j的方向。

我建議你重新考慮它,正確定位相機並採用標準座標標準方式。這將在以後大大簡化對空間的思考。

如果相機看起來towars -Z那麼頂點應該計算這種方式,而不是:

vertecies[index++] = new Vector3(bx + 0, by + 0, 0); // 0 
vertecies[index++] = new Vector3(bx + 0, by + 1, 0); // 1 
vertecies[index++] = new Vector3(bx + 1, by + 0, 0); // 2 
vertecies[index++] = new Vector3(bx + 1, by + 1, 0); // 3 

請注意:這不是那麼簡單的代碼。小錯誤(某些+-符號或+1/-1丟失某處)比可能更多,您應該相應地更正它們。這一切應該讓你更好地瞭解問題,但最終你將不得不運行並調試它,直到它正常工作。

+0

感謝您的幫助隊友,虐待這個檢查出我的代碼謝謝你的幫助。 –

+0

我把「你需要循環到包括寬度或深度(使用<= width或

+0

很高興知道你已經解決了這個問題:) – pid

1

我會建議在可能的情況下嘗試使用Unity的內置函數,但如果不適用於您,此腳本應該在不需要額外努力的情況下執行所需操作:http://wiki.unity3d.com/index.php?title=CreatePlane&oldid=10448

如果你想堅持你的代碼,上面的答案涵蓋了你的發佈代碼的問題。

+0

我同意,但不清楚他是否想要實現某些東西,或者試圖真正理解他在做什麼,或者將代碼演變爲更復雜的算法,如遊行廣場或行軍的立方體。在這些情況下,您必須從頭開始構建網格。 – pid