2017-09-29 1 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 * width (또는 x * height + y)입니다.

IMO 이러한 문제에 접근하는 가장 좋은 방법은 예상대로 작동하고 작동하지 않는 값을 수동으로 계산하고 패턴을 찾았는지 확인하는 것입니다.

귀하의 경우에는 (0 | 0)이 작동하지 않는 반면, (0 | 9)은 왜 작동합니까?

따라서 x = 0 및 y = 0을 사용하면 [0 * 0 * 6 + num] = 0 + num의 값을 얻게됩니다. 이제 우리는 x = 0, y = 9, 그리고 아아아 vert [0 * 9 * 6 + num]는 여전히 0 + num입니다. 나중에 (0 | 9)가 계산되기 때문에, 문제는 (0 | 0)의 verts, uvs 및 triangles가 그 값에 의해 덮어 쓰여진다는 것입니다. 예를 들어, 3 * 5 같은 모든 것이 inbetween의 문제입니다. 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(); 
관련 문제