2017-04-14 3 views
0
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class Grid : MonoBehaviour 
{ 
    private MeshFilter meshf; 
    private Mesh mesh; 
    private Vector3[] vertices; 

    private void Start() 
    { 
     StartCoroutine(GenerateOrigin()); 
    } 

    private IEnumerator GenerateOrigin() 
    { 
     // You can change that line to provide another MeshFilter 
     meshf = GetComponent<MeshFilter>(); 
     mesh = new Mesh(); 
     meshf.mesh = mesh; 
     mesh.Clear(); 

     #region Vertices 

     WaitForSeconds wait = new WaitForSeconds(0.05f); 
     vertices = new Vector3[resX * resZ]; 
     for (int z = 0; z < resZ; z++) 
     { 
      // [ -length/2, length/2 ] 
      float zPos = ((float)z/(resZ - 1) - .5f) * length; 
      for (int x = 0; x < resX; x++) 
      { 
       // [ -width/2, width/2 ] 
       float xPos = ((float)x/(resX - 1) - .5f) * width; 
       vertices[x + z * resX] = new Vector3(xPos, 0f, zPos); 
       yield return wait; 
      } 
     } 
     #endregion 

     #region Normales 
     Vector3[] normales = new Vector3[vertices.Length]; 
     for (int n = 0; n < normales.Length; n++) 
      normales[n] = Vector3.up; 
     #endregion 

     #region UVs  
     Vector2[] uvs = new Vector2[vertices.Length]; 
     for (int v = 0; v < resZ; v++) 
     { 
      for (int u = 0; u < resX; u++) 
      { 
       uvs[u + v * resX] = new Vector2((float)u/(resX - 1), (float)v/(resZ - 1)); 
      } 
     } 
     #endregion 

     #region Triangles 
     int nbFaces = (resX - 1) * (resZ - 1); 
     int[] triangles = new int[nbFaces * 6]; 
     int t = 0; 
     for (int face = 0; face < nbFaces; face++) 
     { 
      // Retrieve lower left corner from face ind 
      int i = face % (resX - 1) + (face/(resZ - 1) * resX); 

      triangles[t++] = i + resX; 
      triangles[t++] = i + 1; 
      triangles[t++] = i; 

      triangles[t++] = i + resX; 
      triangles[t++] = i + resX + 1; 
      triangles[t++] = i + 1; 
     } 
     #endregion 

     mesh.vertices = vertices; 
     mesh.normals = normales; 
     mesh.uv = uvs; 
     mesh.triangles = triangles; 

     mesh.RecalculateBounds(); 
    } 

    private void OnDrawGizmos() 
    { 
     Gizmos.color = Color.black; 
     for (int i = 0; i < vertices.Length; i++) 
     { 
      Gizmos.DrawSphere(vertices[i], 0.1f); 
     } 
    } 
} 

私はWaitForSecondsを使用しており、Waitを返しています。 そして、私が最後に頂点を作成した後には、これは次のようなものです。赤は頂点にないメッシュです。 多分私はよく分かりません。私はそれが頂点上にあるべきだと思った。ギズモを使用するときに、図面が適合しないのはなぜですか?

Mesh

答えて

1

あなたのアカウントにスペース内のオブジェクトの場所を取っていません。原点からオフセットしていますが、そのオフセットは無視して、原点を基準にして頂点を描画しています。

、オブジェクトではなく(0,5,0)に置いた場合の頂点が現れる場合、この行は:

vertices[x + z * resX] = new Vector3(xPos, 0f, zPos); 

は、Y 0は、頂点座標に留意されたいです。 0 != 5

オブジェクトのワールドスペース位置のオフセットを追加する必要があります。

vertices[x + z * resX] = new Vector3(xPos + transform.position.x, transform.position.y, zPos + transform.position.z); 
関連する問題