2016-06-19 19 views
1

Momentan versuche ich, einen Cube innerhalb einer Monogame-Anwendung zu rendern. Ich verwende das Valve-Map-Dateiformat. Das Kartenformat ist in der folgenden Wiki-Seite beschrieben:Rendern eines durch Ebenen definierten Würfels (Valve Map-Dateiformat)

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

Das Importieren des Formats ist unkompliziert und überhaupt kein Problem. Der wichtige Abschnitt ist die Beschreibung der Ebenen. Das Format sieht so aus:

{ 
    (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 ... 
} 

Jede Zeile definiert eine Ebene. Um eine tatsächliche Ebene zu definieren, müssen drei Punkte angegeben werden (dargestellt durch x1, y1, z1, x2, y2, z2 und x3, y3, z3).

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

Dies definiert die drei Punkte, die verwendet werden, um die Ebene der Orientierung und Position in der dreidimensionalen Welt zu setzen. Die erste markiert die untere linke Seite des Gesichts, die zweite markiert die obere linke und die dritte markiert die obere rechte Seite. Unten ist eine Animation eines einfachen Pinsels, der aus sechs Ebenen über CSG erstellt wurde. Der erste, zweite und dritte Ebenenpunkt wird durch rote, grüne und blaue Punkte dargestellt.

Animation

So bin Laden ich diese Ebenen und machen sie als Dreiecke. Das Ergebnis Redering in meiner Anwendung monogame ist dies:

Rendering Result

So offensichtlich gibt es einige Teile in der dritten Potenz fehlt.

Ich erstelle die Map-Datei mit Worldcraft Hammer Editor. So sollte das Ergebnis wie folgt aussehen:

Worldcraft Hammer

Vertex-Creation-Methode:

Transformation von Bürsten und Gesichter VertexPositionColor Typen 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 Modell:

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

Rendering-Methode:

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

ich ein fundemental Stück bin fehlt. Wie kann ich einen Würfel aus den gegebenen Ebenen erstellen?

Ich frage nicht nach einem vollständigen Code oder einer fertigen Lösung, sondern nach jemandem, der mich in die richtige Richtung treibt.

Vielen Dank im Voraus.

aktualisieren

machte ich ein sehr einfaches Projekt für dieses und hochgeladen es meinem Microsoft Onedrive Konto:

OneDrive Link

Antwort

3

Ein Würfel aus 6 Quads wird (6 Rechtecke). Ein Quad ist zwei Dreiecke, nicht eins. Und da ein Quad 2 Dreiecke ist, hat es 6 Ecken. Um also einen Würfel zu rendern, müssen Sie 36 Eckpunkte handhaben.

Alle Informationen zu den 36 Scheitelpunkten befinden sich in diesen 18 Scheitelpunkten, aus denen Ihre Flugzeuge bestehen.

Für alle 36 Scheitelpunkte gibt es nur 6 eindeutige Komponentenwerte. Für jeden der 36 Eckpunkte, die einen Würfel bilden, können nur 2 mögliche X-Werte, 2 mögliche Y-Werte und 2 mögliche Z-Werte vorhanden sein. Alle 36 Scheitelpunkte bestehen aus den verschiedenen Kombinationen dieser 6 eindeutigen Werte.

Ihre Aufgabe ist es, durch die 6 Ebenen (18 Scheitelpunkte) zu iterieren und die 6 eindeutigen Komponentenwerte herauszuziehen und dann Ihre 36 Scheitelpunkte aus diesen 6 Komponentenwerten zu bilden. Dann füllen Sie Ihren VertexBuffer mit den 36 Scheitelpunkten.

+0

Vielen Dank! – Sneijder