2016-08-02 34 views
0

Ich arbeite an einem 3D LibGDX-Projekt und versuche, die Scheitelpunkte eines 3D-Modells zu manipulieren. Ich habe das Modell Laden, und ich habe dies als meinen Code:Was gibt die mesh.getVerticies von LibGDX aus?

Model plain = assets.get("plain.g3db", Model.class); 
for(Mesh m : plain.meshes){ 
    float[] t = m.getVertices(new float[m.getMaxVertices()]); 
    float[] newVerticies = new float[m.getMaxVertices()]; 
    for(int i = 0; i < t.length-1; i++){ 
     newVerticies[i] = t[i]; 
     System.out.println("X: " + t[i] + " " + i); 
     newVerticies[i] = t[i]; 
     System.out.println("Y: " + t[i++] + " " + i); 
     newVerticies[i] = random.nextInt(1-0) + 0; 
     System.out.println("Z: " + t[i++] + " " + i); 
     newVerticies[i] = t[i]; 
     System.out.println("R: " + t[i++]); 
     newVerticies[i] = t[i]; 
     System.out.println("G: " + t[i++]); 
     newVerticies[i] = t[i]; 
     System.out.println("B: " + t[i++]); 
     newVerticies[i] = t[i]; 
     System.out.println("A: " + t[i++]); 
    } 
    m.setVertices(newVerticies); 
} 

das nicht funktioniert, wie ich will es, aber ich kann das Modell zumindest sehen. Wenn ich diese Zeilen auskommentiere:

newVerticies[i] = t[i]; 
System.out.println("R: " + t[i++]); 
newVerticies[i] = t[i]; 
System.out.println("G: " + t[i++]); 
newVerticies[i] = t[i]; 
System.out.println("B: " + t[i++]); 
newVerticies[i] = t[i]; 
System.out.println("A: " + t[i++]); 

Ich bekomme nur einen schwarzen Bildschirm. Selbst wenn ich mich bewege, sehe ich nichts. Was ich wissen will, ist was genau float[] t = m.getVertices(new float[m.getMaxVertices()]); ausgibt. Wie stimmt die Ausgabe mit dem Modell überein? Wie kann ich den Y-Wert in einem Bereich zufällig machen?

Antwort

1

Netzdaten sind in VertexAttributes organisiert. Diese beinhalten immer Position, sondern kann auch Farbe, Texturkoordinaten, Normalen, usw. Zum Beispiel kann ein Gitter mit einer Textur haben könnte folgendes:

  • A Position VertexAttribute der Größe 3 für X, Y und Z (es ist möglich, ein 2D-Gitter zu haben, wo das Positionsattribut hat nur 2)
  • A TextureCooridantes VertexAttribute die Größe 2 für U und V
  • A Normale VertexAttribute mit Größe 3 für X, Y und Z

So würde das Float-Array mit mesh.getVertices() gesetzt werden von 8 schwimmt für jeden Eckpunkt, einer nach dem anderen.

Wenn Sie Ihr Mesh aus einer Modelldatei geladen haben, anstatt es manuell zu erstellen, sind Sie möglicherweise nicht sicher, welches VertexAttribute-Setup es hat. Sie müssen es also untersuchen, um herauszufinden, welcher Offset des Attributs gewünscht ist:

int positionOffset = mesh.getVertexAttributes().getOffset(Usage.Position); 
int yOffset = positionOffset + 1; //skip X 
int vertexSize = mesh.getVertexSize()/4; //divide to convert bytes to floats 

Nun wollte, wenn Sie Y ändern, würden Sie Schleife durch die Eckpunkte etwas wie folgt aus:

//this is how to get the properly sized mesh: 
float[] vertices = new float[mesh.getNumVertices() * mesh.getVertexSize()/4]; 
mesh.getVertices(vertices); 

for (int i = yOffset; i < vertices.length; i += vertexSize){ 
    vertices[i] += someValue; 
} 
mesh.setVertices(vertices); 

die Indizes Gruppen von drei Eckpunkte zeigen, dass die drei~~POS=TRUNC des Netzes bilden. Wenn auf Ihrem Gitter Scheitelpunkte vorhanden sind, die für mehrere Dreiecke gleich sind, werden sie möglicherweise nur einmal in der Scheitelpunktliste angezeigt. Dies tritt typischerweise auf weich schattierten Scheitelpunkten eines Gitters auf, da die UV- und Normalen für alle angrenzenden Dreiecke, die diesen Scheitelpunkt berühren, gleich sind.