Ein schwieriges Thema.
Ich möchte mehrere Meshes die aus 4 Daten-Sets bestehen miteinander verschmelzen.
Die vier Daten-Sets sind Vertices, Indices, Texture Coordinates und Normals.
Der Grund warum ich das machen möchte ist, dass das Spiel an dem ich arbeite sehr viel prozedual genrierten Content haben wird. Zum Beispiel wird ein Schwertgrif und eine Klinge zu einem kompletten Schwert-Mesh.
Diese Verschmelzung soll auch mit Transformationen arbeiten können.
Ungefähr so sollte die Methode am Ende aussehen:
Das was ich mir bisher überlegt habe ist:
Step 1:
Die Vertices und Normals aller Meshes mit der Transformation des Meshes zu multiplizieren. Die Methode zum multiplizieren sieht so aus:
Step 2:
Die Vertex-, TexCoord- und Normal-Arrays aller Meshes zusammenzuführen.
Also das heist das das Vertex-Array von Mesh 2 and das von Mesh 1 gehängt wird und so weiter.
Step 3:
Die Index-Arrays der Meshes zusammenführen nachdem die Summe der Meshes davor zum Index addiert wurde.
Also wenn Mesh 1 800 Indices hat dann müssen bei Mesh 2 natürlich alle Indices um 800 erhöht werden.
Hier gibt es jetzt jedoch das Problem.
Es kann vorkommen, dass Mesh 1 und 2 sich einen Vertex normalerweise teilen würden.
Mit meinen Schritten tun sie das aber nicht. Der Vertex wird einfach 2 Mal in den Speicher geladen.
Wie kann ich dieses Problem beheben?
Ich möchte mehrere Meshes die aus 4 Daten-Sets bestehen miteinander verschmelzen.
Die vier Daten-Sets sind Vertices, Indices, Texture Coordinates und Normals.
Der Grund warum ich das machen möchte ist, dass das Spiel an dem ich arbeite sehr viel prozedual genrierten Content haben wird. Zum Beispiel wird ein Schwertgrif und eine Klinge zu einem kompletten Schwert-Mesh.
Diese Verschmelzung soll auch mit Transformationen arbeiten können.
Ungefähr so sollte die Methode am Ende aussehen:
Java:
public static final MeshData mergeMeshes(List<MeshData> meshes, List<Matrix4f> transformations) {
float[] vertices;
float[] texCoords;
float[] normals;
int[] indices;
// DO STUFF
MeshData data = new MeshData();
data.setVertices(vertices);
data.setIndices(indices);
data.setNormals(indices);
data.setTextureCoordinates(texCoords);
return data;
}
Das was ich mir bisher überlegt habe ist:
Step 1:
Die Vertices und Normals aller Meshes mit der Transformation des Meshes zu multiplizieren. Die Methode zum multiplizieren sieht so aus:
Java:
public static final Vector3f multiply(Matrix4f matrix, float x, float y, float z) {
Vector3f result = new Vector3f();
result.x = x * matrix.m00 + y * matrix.m01 + z * matrix.m02;
result.y = x * matrix.m10 + y * matrix.m11 + z * matrix.m12;
result.z = x * matrix.m20 + y * matrix.m21 + z * matrix.m22;
return result;
}
Step 2:
Die Vertex-, TexCoord- und Normal-Arrays aller Meshes zusammenzuführen.
Also das heist das das Vertex-Array von Mesh 2 and das von Mesh 1 gehängt wird und so weiter.
Step 3:
Die Index-Arrays der Meshes zusammenführen nachdem die Summe der Meshes davor zum Index addiert wurde.
Also wenn Mesh 1 800 Indices hat dann müssen bei Mesh 2 natürlich alle Indices um 800 erhöht werden.
Hier gibt es jetzt jedoch das Problem.
Es kann vorkommen, dass Mesh 1 und 2 sich einen Vertex normalerweise teilen würden.
Mit meinen Schritten tun sie das aber nicht. Der Vertex wird einfach 2 Mal in den Speicher geladen.
Wie kann ich dieses Problem beheben?