2016-06-19 4 views
1

현재 모노 게임 응용 프로그램에서 큐브를 렌더링하려고합니다. 밸브 맵 파일 형식을 사용하고 있습니다. 지도 형식은 다음 wiki 페이지에 설명되어 있습니다.평면으로 정의 된 큐브 렌더링 (밸브 맵 파일 형식)

https://developer.valvesoftware.com/wiki/MAP_file_format.

형식을 가져 오는 것은 간단하고 전혀 문제가되지 않습니다. 중요한 부분은 비행기에 대한 설명입니다. 형식은 다음과 같습니다.

{ 
    (x1 y1 z1) (x2 y2 z2) (x3 y3 z3) texture_name ... 
    (x1 y1 z1) (x2 y2 z2) (x3 y3 z3) texture_name ... 
    (x1 y1 z1) (x2 y2 z2) (x3 y3 z3) texture_name ... 
    (x1 y1 z1) (x2 y2 z2) (x3 y3 z3) texture_name ... 
    (x1 y1 z1) (x2 y2 z2) (x3 y3 z3) texture_name ... 
    (x1 y1 z1) (x2 y2 z2) (x3 y3 z3) texture_name ... 
} 

모든 행은 하나의 평면을 정의합니다. 하나의 실제 평면을 정의하려면 세 점을 지정해야합니다 (x1, y1, z1, x2, y2, z2 및 x3, y3, z3으로 표시).

plane ((vertex) (vertex) (vertex)) 

이 값은 3 차원 세계에서 비행기의 방향과 위치를 설정하는 데 사용될 세 점을 정의합니다. 첫 번째는 얼굴 왼쪽 하단을 표시하고 두 번째는 왼쪽 상단을 표시하고 세 번째는 오른쪽 상단을 표시합니다. 아래는 CSG를 ​​통해 여섯 개의 평면으로 구성되는 간단한 브러쉬의 애니메이션입니다. 첫 번째, 두 번째 및 세 번째 평면 점은 빨강, 녹색 및 파랑 점으로 표시됩니다.

Animation

그래서 나는이 비행기를로드 삼각형로 렌더링하고있다. 내 monogame 응용 프로그램 내에서 redering 결과가 이것이다 :

Rendering Result

그래서 분명히 큐브의 일부 누락이 있습니다.

나는 worldcraft hammer editor로지도 파일을 만들고 있습니다. 브러쉬가

변환 및 유형 VertexPositionColor XNA 위해 직면

Worldcraft Hammer

정점 창작-방법 : 그래서 결과는 다음과 같을 것이다.

private VertexPositionColor[] CreateVertexPositions(Brush brush) 
    { 
     VertexPositionColor[] vertices = new VertexPositionColor[brush.Faces.Count * 3]; 

     int j = 0; 
     for (int i = 0; i < brush.Faces.Count; i++) 
     { 
      Face brushFace = brush.Faces[i]; 
      Color color = ColorUtils.GenerateRandomColor(Color.Wheat); 

      vertices[i + j + 0] = new VertexPositionColor(// bottom left of the face 
       new Vector3(brushFace.V1.X, brushFace.V1.Y, brushFace.V1.Z), color 
      ); 
      vertices[i + j + 1] = new VertexPositionColor(// top left of the face 
       new Vector3(brushFace.V2.X, brushFace.V2.Y, brushFace.V2.Z), color 
      ); 
      vertices[i + j + 2] = new VertexPositionColor(// top right of the face 
       new Vector3(brushFace.V3.X, brushFace.V3.Y, brushFace.V3.Z), color 
      ); 

      j = j + 2; 
     } 

     return vertices; 
    } 

BrushFace 모델 :

public sealed class Face 
{ 
    public Vertex3 V1 { get; set; } 
    public Vertex3 V2 { get; set; } 
    public Vertex3 V3 { get; set; } 
    public string TextureName { get; set; } 
    public Plane P1 { get; set; } 
    public Plane P2 { get; set; } 
    public int Rotation { get; set; } 
    public float XScale { get; set; } 
    public float YScale { get; set; } 
} 

렌더링-방법 :

public override void Render(ICamera camera) 
    { 
     _effect.Projection = camera.Projection; 
     _effect.View = camera.View; 
     _effect.World = camera.World; 

     RasterizerState rasterizerState = new RasterizerState(); 
     rasterizerState.CullMode = CullMode.None; 
     rasterizerState.FillMode = FillMode.Solid; 
     GraphicsDevice.RasterizerState = rasterizerState; 

     foreach (EffectPass pass in _effect.CurrentTechnique.Passes) 
     { 
      pass.Apply(); 
      GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, _vertices.ToArray(), 0, (_vertices.Count/3), VertexPositionColor.VertexDeclaration); 
     } 
    } 

은 내가 fundemental 조각을 놓친 거지. 주어진 평면에서 큐브를 어떻게 만들 수 있습니까?

완벽한 코드 나 완성 된 솔루션을 요구하는 것이 아니라 올바른 방향으로 나를 밀어 붙이는 누군가를위한 것입니다.

미리 감사드립니다.

업데이트 나는 이것에 대한 아주 간단한 프로젝트를 만들어 내 원 드라이브 계정에 업로드 :

OneDrive Link

답변

3

큐브는 6 쿼드 (6 개 사각형)로 구성되어 있습니다. 쿼드는 하나가 아닌 두 개의 삼각형입니다. 쿼드는 2 개의 삼각형이므로 6 개의 정점이 있습니다. 따라서 큐브를 렌더링하려면 36 개의 정점을 처리해야합니다.

36 개의 꼭지점을 구성하는 모든 정보는 평면을 구성하는 18 개의 꼭지점에 있습니다.

모든 36 개의 꼭지점에는 6 개의 고유 한 구성 요소 값만 있습니다. 큐브를 구성하는 36 개의 꼭지점 중 하나에 대해 가능한 X 값은 2 개, 가능한 Y 값은 2 개, 가능한 Z 값은 2 개가 될 수 있습니다. 모든 36 개의 꼭지점은 6 개의 고유 한 값의 다양한 조합으로 구성됩니다.

당신의 임무는 6 개의 평면 (18 개의 꼭지점)을 반복하고 6 개의 고유 한 구성 요소 값을 빼내어 6 개의 구성 요소 값 중에서 36 개의 꼭지점을 구성하는 것입니다. 그런 다음 VertexBuffer에 36 개의 꼭지점을 채 웁니다.

+0

대단히 감사합니다! – Sneijder