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.
So bin Laden ich diese Ebenen und machen sie als Dreiecke. Das Ergebnis Redering in meiner Anwendung monogame ist dies:
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:
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:
Vielen Dank! – Sneijder