Ich möchte eine dreidimensionale Rennstrecke um einen Spline erzeugen, der seine Form beschreibt. Hier ist ein illustratives Video .
Die Strecke sollte ein endloser Tunnel sein, der entlang eines 3D-Splines verläuft und einige Hindernisse aufweist. Meine bisher beste Idee war es, eine Kreisform entlang des Splines zu schlagen.
Ich möchte auch einige Hinweise zum Verwalten der Geometrie, dh zum Erstellen aus der Loft-Operation, zum Verwalten des "Lebenszyklus" in Bezug auf Speicher, Kollision und Texturierung.
opengl
3d
racing
procedural
Valentin Galea
quelle
quelle
Antworten:
Ich bin nicht sicher, in welcher Sprache Sie arbeiten, aber hier finden Sie ein Beispiel für eine prozedurale Netzextrusion für Unity3D:
http://unity3d.com/support/resources/example-projects/procedural-examples
Ich bin sicher, Sie könnten sich den Code ansehen und ihn für Ihre Situation überarbeiten.
EDIT: Ich arbeite an einem Spiel, das ein prozedurales extrudiertes Schienensystem verwendet, wie das, das Sie starten, aber es ist in C # in Unity3d. Ich gebe Ihnen einen Überblick darüber, wie ich meine Schienenextrusion basierend auf einem kubischen Bezier-Pfad erstelle. Obwohl das Netz der Schiene prozedural generiert wird, basiert es auf dem Bezier-Pfad, den ich vorab in einem Editor definiert habe. Es wäre wie ein Level-Editor für Ihr Spiel, in meinem Fall werden Flipper-Tische entworfen. Nachfolgend finden Sie ein Beispiel dafür, wie ich es mache:
1.) Erstellen / Suchen und Implementieren einer Bezier-Pfadklasse. Dadurch erhalten Sie die Quelldaten für Ihre Netzextrusion. Hier gibt es eine in C #, die Sie nach C ++ portieren können.
http://forum.unity3d.com/threads/32954-Waypoints-and-constant-variable-speed-problems?p=213942
2.) Sobald Sie einen Bezier-Pfad erstellt haben, werden Datenpunkte aus diesem Pfad abgetastet. Dies kann über die Interp-Methode für die oben angegebene Klasse erfolgen. Dadurch erhalten Sie eine Liste / ein Array von Vector3-Punkten entlang des Bezier-Pfads.
3.) Erstellen Sie eine Hilfsklasse, um die Vector3 Bezier-Pfaddaten aus Schritt 2 zu konvertieren. In diesem Fall habe ich eine einfache Klasse namens ExtrudedTrailSection, wie unten definiert:
4.) Durchlaufen Sie Ihre Vector3-Beispieldaten und konvertieren Sie sie in ein Array von ExtrudedTrailSections, das die Beispieldaten und eine Basismatrix liefert, die der Stammort Ihres extrudierten Netzes ist.
Matrix4x4 worldToLocal = rootTransform.worldToLocalMatrix;
6.) Jetzt haben Sie ein Array von Matrix4x4 [] und können ein Netz extrudieren, aber zuerst benötigen wir ein Referenznetz zum Extrudieren. Ich habe eine Utility-Klasse, die eine kreisförmige Netzfläche erstellt, die wir für die Netzextrusionsmethode bereitstellen.
7.) Finden Sie die Mitte dieser Daten:
8.) Nachdem wir nun die Kanten- und Mitteldaten für ein radiales Flächennetz haben, können Sie mit Ihren Daten ein Netzobjekt erstellen. Der letzte Scheitelpunkt im Netz ist der von uns berechnete Mittelpunkt. Das endgültige Netz ist nur eine Fläche, die für die Netzextrusionsmethode bereitgestellt wird, für die ich ein Beispiel in der Klasse "Prozedurale Netzextrusion" des Unity-Pakets angegeben habe. Auch dies ist meine Methode und natürlich müssten Sie diese Daten in OpenGL einspeisen. Wenn Sie eine 3D-Dienstprogrammbibliothek haben, die Sie verwenden, oder Ihre eigene Netzklasse schreiben können, ist es wahrscheinlich besser, Ihr endgültiges extrudiertes Netz zu generieren, da diese Daten von opengl für das Rendern nicht wirklich benötigt werden. Dieses Flächennetz wird nur als Referenz für die Maschenextrusion verwendet.
9.) Finden Sie die Außenkanten des kreisförmigen Netzes nach Bedarf für die Netzextrusionsmethode. Dieser Code ist wiederum im Unity-Paket enthalten.
10.) Geben Sie alle diese Daten in die Mesh-Extrusionsmethode ein.
Die endgültige Ausgabe in meinem Fall sieht so aus ..
Viel Glück, dein Spiel sieht wirklich cool aus! Lassen Sie mich wissen, wenn Sie es herausfinden?
Futter
quelle