JavaFX: ein Mesh Objekt in einer 3D-Welt hinzufügen

Die Objekte können Sie am einfachsten in Ihre virtuelle JavaFX Welt hinzufügen, werden erstellt unter Verwendung der drei integrierten 3D-Form-Klassen, die mit JavaFX kommen: Zylinder, Box, und Kugel. Für komplexere Objekte, müssen Sie die Verwendung TriangleMesh Klasse das Objekt zu erstellen, die auf einer Reihe von zusammenhängenden Dreiecke berechnet.

Hier entsteht eine der einfachsten aller Netzobjekte: die vierseitigen Pyramide hier abgebildet. Optisch weist eine vierseitige Pyramide mit insgesamt fünf Gesichter: die vier dreieckigen Seitenflächen und die quadratischen Grundfläche. Aber in einem JavaFX Dreiecksnetz, Plätze sind nicht erlaubt, nur Dreiecke. So ist die Pyramide besteht eigentlich aus sechs Flächen: die vier dreieckigen Seitenflächen und zwei benachbarte Dreiecke, die das Gesicht.

In diesem Abschnitt werden ziemlich konzeptionell schwierig, Informationen. Wenn Sie Maschen in einem Computer Graphics-Klasse nicht studiert haben, bereit sein, durch den folgenden Absätzen mehrmals zu lesen, bevor es Sinn zu machen beginnt.

Wenn es immer noch nicht sinnvoll, schnappen Sie sich einen Latte, ziehen Sie ein Blatt Millimeterpapier aus, und doodling starten. Zeichnen der Pyramide mit der eigenen Hand wird Ihr Verständnis helfen. Versuchen Sie, einen Bleistift.

Eine quadratische Pyramide in JavaFX.
Eine quadratische Pyramide in JavaFX.

Um die Pyramide begonnen erhalten, rufen Sie die TriangleMesh Konstruktor wie folgt aus:

TriangleMesh pyramidMesh = new TriangleMesh () -

Um die Pyramide abzuschließen, müssen Sie drei Sammlungen zu füllen, die die Geometrie des Netzes definieren. Diese Sammlungen halten die Punkte, die Gesichter, und die Texturkoordinaten, die die Form definieren.

Beginnen Sie mit der Texturkoordinaten-Sammlung, weil man so ziemlich alles für diese einfache Pyramide ignorieren können. Texturkoordinaten sind nützlich, wenn man ein Material verwenden, das ein Bild enthält, das in einer bestimmten Art und Weise über den Rahmen des Netzes gestreckt werden sollte. Sie ermöglichen es, eine bestimmte x- zuzuordnen, wobei jede Ecke jedes Gesicht im Bild Y-Koordinate.

Leider kann man nicht einfach weglassen, die Texturkoordinaten, auch wenn Sie sie nicht benötigen, so müssen Sie mindestens eine Koordinate laden. Tun Sie das mit dieser Codezeile:

. PyramidMesh.getTexCoords () addAll (0,0) -

Gehen Sie nun zu den beiden anderen Sammlungen. Der nächste Schritt ist eine Sammlung der Eckpunkte (Das heißt, Ecken), die die Form definieren. Ihre quadratischen Pyramide hat fünf Ecken, die Sie als oben vorstellen kann, der vorderen Ecke (der Punkt Ihrer Nähe), der linken Ecke, der hinteren Ecke, und die rechte Ecke. Diese Ecken sind nummeriert von 0, 1, 2, 3 und 4.

In Anbetracht der Höhe h und die Länge s von jeder Seite der Pyramide, können Sie die x-, y- und z-Koordinaten für jeden Vertex unter Verwendung der folgenden Formeln berechnet werden:

ScheitelEckeXYZ
0Oben000
1Vorderseite0h-s / 2
2Links-s / 2h0
3Zurücks / 2h0
4Recht0hs / 2

Mit allem, als Hintergrund, hier ist der Code die Punkte Sammlung zu erstellen:

float h = 150 - // Heightfloat s = 300 -. // SidepyramidMesh.getPoints () addAll (0,0,0, // Punkt 0 - top0, h, -s / 2 // Punkt 1 - Front-s / 2, h, 0, // Punkt 2 - Lefts / 2, h, 0, // Punkt 3 - Back0, h, s / 2 // Punkt 4 - Right) -

Die letzte Kollektion definiert die Gesichter. Die Flächen werden durch die Angabe der Index jedes Vertex definiert, die jedes Gesicht bildet. Zum Beispiel ist die vordere linke Seite ein Dreieck, dessen drei Ecken sind die Besten, die vorne und links. Die Indizes für diese drei Scheitelpunkte sind 0, 2 und 1.

Es gibt insgesamt sechs Dreiecke in der Pyramide, und ihre Gesichter sind durch folgende Punkte festgelegt:

GesichtPunkt 1Punkt 2Punkt 3
Vorne links021
Vorne rechts013
Hinten rechts034
Hinten links042
hinten unten412
Bottom Front432

Obwohl es nicht aus dieser Tabelle ersichtlich, kann, in welcher Reihenfolge die Flächen erscheinen ist entscheidend für den Erfolg des Netzes. Im allgemeinen werden die Flächen in einer gegen den Uhrzeigersinn und nach unten aufgeführten Reihenfolge. So wickeln die vier Seitenflächen um die Pyramide im Gegenuhrzeigersinn. Sie werden von den beiden unteren Flächen gefolgt.

Jede Fläche in der Gesichtsansammlung wird durch drei Paare von Zahlen dargestellt, welche jeweils den Index eines der Scheitelpunkte des Dreiecks darstellt, und den Index des entsprechenden Texturkoordinaten.

Da Sie nur ein Element in der Textur Sammlung Koordinaten haben, wird die zweite Zahl in jedem Paar immer Null sein. Somit ist die Sequenz 0, 0, 2, 0, 1, definiert 0 die vordere linke Seite: Die Vertex-Indizes sind 0, 2 und 1, und die Texturkoordinaten-Indizes sind alle 0.

Hier ist der Code, um die Gesichter Sammlung zu laden:

pyramidMesh.getFaces (). addAll (0,0, 2,0, 1,0, // vorne links face0,0, 1,0, 3,0, // vorne rechts face0,0, 3,0, 4, 0, // Zurück rechts face0,0, 4,0, 2,0, // Zurück links face4,0, 1,0, 2,0, // hinten unten face4,0, 3,0, 1,0 / / Bottom Vorderseite) - 

Nachdem die drei Sammlungen des Netzes bereit sind, fleshes der Rest des Codes, die Pyramide, indem eine Phong Material hinzufügen, übersetzt die Pyramide den Mittelpunkt der Szene zu bekommen, und fügt die Pyramide an der Wurzel:

MeshView Pyramide = new MeshView(pyramidMesh)-pyramid.setDrawMode(DrawMode.FILL)-pyramid.setMaterial(blueStuff)-pyramid.setTranslateX(200)-pyramid.setTranslateY(100)-pyramid.setTranslateZ(200)-root.getChildren().add(pyramid)-

Menü