2017-09-29 4 views
0

私は、スクリプトを使っていくつかの地形を描画しようとしています。しかし、私は奇妙な結果を得て、その問題点を突き止めることはできません。地形メッシュをスクリプトで描画する

Startメソッドでは、私は初期メッシュを構築しています。

Vector3[] verts = new Vector3[mapWidth * mapHeight * 6]; 
    Vector2[] uvs = new Vector2[mapWidth * mapHeight * 6]; 
    int[] triangles = new int[mapWidth * mapHeight * 6]; 

    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      verts[x * y * 6 + 0] = new Vector3(x, 0, y); 
      verts[x * y * 6 + 1] = new Vector3(x + 1, 0, y); 
      verts[x * y * 6 + 2] = new Vector3(x + 1, 0, y + 1); 

      verts[x * y * 6 + 3] = new Vector3(x, 0, y); 
      verts[x * y * 6 + 4] = new Vector3(x + 1, 0, y + 1); 
      verts[x * y * 6 + 5] = new Vector3(x, 0, y + 1); 

      uvs[x * y * 6 + 0] = new Vector2(0, 0); 
      uvs[x * y * 6 + 1] = new Vector2(1, 0); 
      uvs[x * y * 6 + 2] = new Vector2(1, 1); 

      uvs[x * y * 6 + 3] = new Vector2(0, 0); 
      uvs[x * y * 6 + 4] = new Vector2(1, 1); 
      uvs[x * y * 6 + 5] = new Vector2(0, 1); 

      for (int t = 0; t < 6; t++) 
      { 
       triangles[x * y * 6 + t] = x * y * 6 + 5 - t; 
      } 
     } 
    } 

    terrain.vertices = verts; 
    terrain.uv = uvs; 
    terrain.triangles = triangles; 
    terrain.RecalculateNormals(); 

私のメッシュを描くのは、すべてGraphics.DrawMesh(terrain, Vector3.zero, Quaternion.identity, mat, 1);です。マテリアル(マット)は単純なグリッドテクスチャであり、正しく動作しているようです。しかし、ユニティは一見無作為に三角形のカップルを描かないことを決めています。

enter image description here

ギズモは0, 0, 0であり、各ランは、同じ形状をレンダリングします。私は10 x 10の形を描く必要があります。私は最終的にハードエッジを必要とするため、重複した頂点を作成しています。

+0

私はそれらが描かれていると思われますが、間違った表情をしています。 – Programmer

+0

@Programmerいいえ、私は以下を見ました。私はそれらを描いています(三角形の順番を選んでいます)ので、すべて同じ方向に描画する必要があります。 – Madmenyo

+0

私は問題があなたのインデックスだと思う。 x = 0、y = 0の場合は手動で計算を行い、x = 0、y = 1の場合は計算します。何も時刻0は常に0なので、まったく同じになります。なぜそのような奇妙な形のidkを出力するのですか? - それぞれ同じように実行されているので、あなたが示唆するように "ランダム"ではありません。ちょっと参考にするには、x * yの代わりに(x + y * width)が好きだと思います – yes

答えて

2

あなたのやり方の問題はあなたの指数です。 2D配列の「平坦化」の式は、x * yではなくx + y *幅(またはx * height + y)です。

IMOこのような問題にアプローチする最善の方法は、期待どおりに動作していない値を手動で計算し、パターンが見つかったかどうかを確認することです。

あなたのケースでは、(0 | 0)は動作しませんが、(0 | 9)は動作しますが、その理由を確認できます。

したがって、x = 0、y = 0を使用すると、[0 * 0 * 6 + num] = 0 + numのようになります。今度はx = 0、y = 9、そして悲しみ[0 * 9 * 6 + num]はまだ0 + numです。後で(0 | 9)が計算されるので、(0 | 0)のverts、uvs、およびtrianglesがそれらの値によって上書きされるという問題があります。たとえば、3 * 5のようなすべての問題が同じです。 5 * 3と同じです。

コードを修正するには、次のように動作する必要があります。

Vector3[] verts = new Vector3[mapWidth * mapHeight * 6]; 
    Vector2[] uvs = new Vector2[mapWidth * mapHeight * 6]; 
    int[] triangles = new int[mapWidth * mapHeight * 6]; 

    for (int y = 0; y < height; y++) { 
     for (int x = 0; x < width; x++) { 

      int tileIndex = x + y * width; 

      verts[tileIndex * 6 + 0] = new Vector3(x, 0, y); 
      verts[tileIndex * 6 + 1] = new Vector3(x + 1, 0, y); 
      verts[tileIndex * 6 + 2] = new Vector3(x + 1, 0, y + 1); 

      verts[tileIndex * 6 + 3] = new Vector3(x, 0, y); 
      verts[tileIndex * 6 + 4] = new Vector3(x + 1, 0, y + 1); 
      verts[tileIndex * 6 + 5] = new Vector3(x, 0, y + 1); 

      uvs[tileIndex * 6 + 0] = new Vector2(0, 0); 
      uvs[tileIndex * 6 + 1] = new Vector2(1, 0); 
      uvs[tileIndex * 6 + 2] = new Vector2(1, 1); 

      uvs[tileIndex * 6 + 3] = new Vector2(0, 0); 
      uvs[tileIndex * 6 + 4] = new Vector2(1, 1); 
      uvs[tileIndex * 6 + 5] = new Vector2(0, 1); 

      for (int t = 0; t < 6; t++) { 
       triangles[tileIndex * 6 + t] = tileIndex * 6 + 5 - t; 
      } 
     } 
    } 

    terrain.vertices = verts; 
    terrain.uv = uvs; 
    terrain.triangles = triangles; 
    terrain.RecalculateNormals(); 
関連する問題