현재 모노 게임 응용 프로그램에서 큐브를 렌더링하려고합니다. 밸브 맵 파일 형식을 사용하고 있습니다. 지도 형식은 다음 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를 통해 여섯 개의 평면으로 구성되는 간단한 브러쉬의 애니메이션입니다. 첫 번째, 두 번째 및 세 번째 평면 점은 빨강, 녹색 및 파랑 점으로 표시됩니다.
그래서 나는이 비행기를로드 삼각형로 렌더링하고있다. 내 monogame 응용 프로그램 내에서 redering 결과가 이것이다 :
그래서 분명히 큐브의 일부 누락이 있습니다.
나는 worldcraft hammer editor로지도 파일을 만들고 있습니다. 브러쉬가
변환 및 유형 VertexPositionColor XNA 위해 직면
정점 창작-방법 : 그래서 결과는 다음과 같을 것이다.
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 조각을 놓친 거지. 주어진 평면에서 큐브를 어떻게 만들 수 있습니까?
완벽한 코드 나 완성 된 솔루션을 요구하는 것이 아니라 올바른 방향으로 나를 밀어 붙이는 누군가를위한 것입니다.
미리 감사드립니다.
업데이트 나는 이것에 대한 아주 간단한 프로젝트를 만들어 내 원 드라이브 계정에 업로드 :
대단히 감사합니다! – Sneijder