2014-02-19 10 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에 01을 곱합니다.이지만 0에서 depth까지 순환합니다 (그 값은 width입니까?);
  • width 또는 depth까지 순환해야합니다 (<= width 또는 < width + 1 사용).

이들은 단지 UV 좌표이며, 루프의 정점을 유지하지 않습니다. 그것은 당신의 문제를 해결하지 못할 것이지만, 당신이 나중에 알게 될 2 개의 버그 만.

는 삼각형 문제가 이것을 시도 해결하려면

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); 

가 대신 별도의 루프이 을 수행해야합니다 :

나는 또한 당신이 yz를 교환 참조
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 

이 두통의 원인이됩니다이를 기록했다. 또한 세계 공간 좌표와 관련하여 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

나는 "너비 또는 깊이까지 순환해야합니다 (<= 너비 또는 <너비 +1) 사용). 삼각형 문제가 해결되면 모든 삼각형은 꼭지점 중 하나가 없어 졌을 것입니다. –

+0

당신이 문제를 해결했음을 알았습니다. :) – pid

1

가능한 경우 유니티의 내장 기능을 사용하는 것이 좋지만이 스크립트는 도움이되지 않는 경우를 대비하여 추가 작업을하지 않고도 필요한 작업을 수행해야합니다 : http://wiki.unity3d.com/index.php?title=CreatePlane&oldid=10448.

위의 대답은 게시 된 코드의 문제를 다루고 있습니다.

+0

그가 동의 할 지 모르겠지만, 그가 물건을 구현하기를 원하거나 자신이하고있는 일을 실제로 이해하려고 시도하고 있거나 행진하는 사각형과 같은 더 복잡한 알고리즘으로 코드를 진화시킬 것인가 행진 큐브. 이 경우에는 처음부터 메쉬를 구성해야합니다. – pid

관련 문제