3D Mesh und Szene erstellen
Erstellen Sie ein 3D Cube Mesh
A Mesh
wird durch eine Reihe von Kontroll punkten und die vielen n-seitigen Polygone nach Bedarf definiert. In diesem Artikel wird erläutert, wie ein Mesh
definiert wird.
Um eine Mesh
-Oberfläche zu erstellen, müssen wir Steuer punkte und Polygone wie folgt definieren:
- Definieren Sie die Kontroll punkte
- Erstellen Sie Polygone mit der PolygonBuilder-Klasse
- Polygone erstellen
Hier ist ein Beispiel zum Anhängen eines Phong-Materials an den Würfel knoten:
Definieren Sie die Kontroll punkte
Ein Netz besteht aus einer Reihe von Kontroll punkten im Raum und Polygonen, um die Netz oberfläche zu beschreiben. Um ein Netz zu erstellen, müssen wir die Kontroll punkte definieren:
Vector4
statt Vector3
im Beispiel code.
Beispiel:
// Initialize control points | |
Vector4List controlPoints = new Vector4List(8); | |
controlPoints.add(new Vector4( -5.0, 0.0, 5.0, 1.0)); | |
controlPoints.add(new Vector4( 5.0, 0.0, 5.0, 1.0)); | |
controlPoints.add(new Vector4( 5.0, 10.0, 5.0, 1.0)); | |
controlPoints.add(new Vector4( -5.0, 10.0, 5.0, 1.0)); | |
controlPoints.add(new Vector4( -5.0, 0.0, -5.0, 1.0)); | |
controlPoints.add(new Vector4( 5.0, 0.0, -5.0, 1.0)); | |
controlPoints.add(new Vector4( 5.0, 10.0, -5.0, 1.0)); | |
controlPoints.add(new Vector4( -5.0, 10.0, -5.0, 1.0)); |
Polygone erstellen
Die Kontroll punkte sind nicht render ierbar. Um den Würfel sichtbar zu machen, müssen wir Polygone auf jeder Seite definieren:
List<Vector4> controlPoints = defineControlPoints(); | |
// Initialize mesh object | |
Mesh mesh = new Mesh(); | |
// Add control points to the mesh | |
mesh.getControlPoints().addAll(controlPoints); | |
// Create polygons to mesh | |
// Front face (Z+) | |
mesh.createPolygon(new int[] { 0, 1, 2, 3 }); | |
// Right side (X+) | |
mesh.createPolygon(new int[] { 1, 5, 6, 2 }); | |
// Back face (Z-) | |
mesh.createPolygon(new int[] { 5, 4, 7, 6 }); | |
// Left side (X-) | |
mesh.createPolygon(new int[] { 4, 0, 3, 7 }); | |
// Bottom face (Y-) | |
mesh.createPolygon(new int[] { 0, 4, 5, 1 }); | |
// Top face (Y+) | |
mesh.createPolygon(new int[] { 3, 2, 6, 7 }); |
Erstellen Sie Polygone mit der PolygonBuilder-Klasse
Wir können Polygon auch durch Eckpunkte mit der PolygonBuilder-Klasse definieren:
List<Vector4> controlPoints = defineControlPoints(); | |
// Initialize mesh object | |
Mesh mesh = new Mesh(); | |
// Add control points to the mesh | |
mesh.getControlPoints().addAll(controlPoints); | |
// Indices of the vertices per each polygon | |
int[] indices = new int[] | |
{ | |
0,1,2,3, // Front face (Z+) | |
1,5,6,2, // Right side (X+) | |
5,4,7,6, // Back face (Z-) | |
4,0,3,7, // Left side (X-) | |
0,4,5,1, // Bottom face (Y-) | |
3,2,6,7 // Top face (Y+) | |
}; | |
int vertexId = 0; | |
PolygonBuilder builder = new PolygonBuilder(mesh); | |
for (int face = 0; face < 6; face++) | |
{ | |
// Start defining a new polygon | |
builder.begin(); | |
for (int v = 0; v < 4; v++) | |
// The indice of vertice per each polygon | |
builder.addVertex(indices[vertexId++]); | |
// Finished one polygon | |
builder.end(); | |
} |
Jetzt ist es fertig, um das Netz sichtbar zu machen, müssen wir einen Knoten dafür vorbereiten.
Wie man ein Netz trianguliert
Triangulate Mesh ist für die Spiele industrie nützlich, da das Dreiecksnetz das einzige unterstützte Primitiv ist, das die GPU-Hardware unterstützt (nicht dreieckige Daten werden auf Treiber ebene trianguliert, was beim Echtzeit-Rendering ineffizient ist).
In diesem Beispiel triangulieren wir ein Mesh, indem wir eine FBX-Datei importieren und im FBX-Format speichern.
// The path to the documents directory. | |
String MyDir = RunExamples.getDataDir(); | |
// Initialize scene object | |
Scene scene = new Scene(); | |
scene.open(MyDir + "document.fbx"); | |
scene.getRootNode().accept(new NodeVisitor() { | |
@Override | |
public boolean call(Node node) { | |
Mesh mesh = (Mesh)node.getEntity(); | |
if (mesh != null) | |
{ | |
// Triangulate the mesh | |
Mesh newMesh = PolygonModifier.triangulate(mesh); | |
// Replace the old mesh | |
node.setEntity(newMesh); | |
} | |
return true; | |
} | |
}); | |
MyDir = MyDir + RunExamples.getOutputFilePath("document.fbx"); | |
scene.save(MyDir, FileFormat.FBX7400ASCII); |
Erstellen Sie eine 3D Cube-Szene
Dieses Thema zeigt, wie Mesh-Geometrie zur 3D-Szene hinzugefügt wird. Der Beispielcode platziert einen Cube und speichert 3D Szene in den unterstützten Dateiformaten.
Erstellen Sie einen Würfel knoten
Ein Knoten ist unsichtbar, aber die an den Knoten angehängte Geometrie kann gerendert werden.
Beispiel:
// Initialize scene object | |
Scene scene = new Scene(); | |
// Initialize Node class object | |
Node cubeNode = new Node("cube"); | |
// Call Common class create mesh using polygon builder method to set mesh instance | |
Mesh mesh = Common.createMeshUsingPolygonBuilder(); | |
// Point node to the Mesh geometry | |
cubeNode.setEntity(mesh); | |
// Add Node to a scene | |
scene.getRootNode().getChildNodes().add(cubeNode); | |
// The path to the documents directory. | |
String MyDir = RunExamples.getDataDir(); | |
MyDir = MyDir + RunExamples.getOutputFilePath("CubeScene.fbx"); | |
// Save 3D scene in the supported file formats | |
scene.save(MyDir, FileFormat.FBX7400ASCII); |