Liest und zeigt Animationen aus der * .FBX-Datei

9

Ich möchte das 3D-Modell von fbx file lesen und es in openGL es 2.0 engine auf dem iPhone anzeigen (ohne Unity ) und auch Animationen für das gelesene 3D-Objekt anzeigen.

Wie kann ich Animationen von fbx file bekommen?

Momentan kann ich eine Liste von Posenamen bekommen, wie ich es verstanden habe, mit einer Transformationsmatrix, einer vollständigen Liste von Posen in der Ebene, Stapeln, Layern und vielen Kurven.

Wie können diese Informationen kombiniert werden, um richtige Animationen anzuzeigen?

Ich versuche auch, einige Informationen innerhalb von TakeInfo zu analysieren, aber das Ergebnis ist etwas seltsam für mich, zum Beispiel:

%Vor%

Hier habe ich start = 0 und end = 0.014 für jeden geparsten Layer, also ist das falsch ( fbx Datei, die ich anzeigen möchte, enthält 1 Mesh mit einfachen Animationen von 5 Sekunden Dauer).

Aktualisieren

Nach ein paar Stunden Nachforschung bekam ich die nächsten Dinge:

Als Referenz ist dies die Struktur des Testobjekts, das ich anzeigen möchte:

Hier kann man viele Knochen sehen (konkreter - 19) Ich kann (wie oben erwähnt) einen 19 animierten Obj in Liste (wie Namen von Knochen / Obj) und 19 Gruppen von Kurven innerhalb von jeweils 151 Frames (mit Frame-Rate 30 genau 5 Sekunden Anim. - 30 * 5 = 150 +) 1 letzte Identitätsmatrix).

Wenn ich versuche, jede der Kurvengruppen einzeln auf mein Mesh anzuwenden (ich kann nur 1 Mesh analysieren), sehe ich Animationen von verschiedenen Mesh-Bereichen, die auf alle Meshs angewendet werden (zB vertikale Rotation oder horizontale Translation), also I denke, dass diese Kurven in jeder Gruppe genau auf bestimmte Knochen angewendet werden sollten und als Ergebnis werde ich eine Animation für mein Mesh bekommen. Das Problem ist, dass ich nicht weiß, wie nur ausgewählte Knochenscheitelpunkte nur animiert werden.

Jetzt ist das Problem, wie man diese alle Animationen anwendet, die in getrennte Gruppe spezifisch sind, die zu Knochen zum Gesamtobj ist (weil ich nur ein Ineinandergreifen habe)?

Wie kann ich 1 globale Kurvenliste für jedes Bild aus der Liste mit allen Kurvengruppen erhalten?

Update2

Dank @codetiger Ratschläge folge ich Anweisungen innerhalb des angegebenen Links im Kommentar und mit dieser Technik kann ich eine Liste knochenspezifischer Matts mit Start- und Endzeit und erforderlichen Transformationen abrufen, aber das ist fast das gleiche wie zuvor mit Kurven - der einzige Unterschied, dass ich mit Kurven aus 9 Kurven (translate / scale / rotate für xyz) mattieren sollte, anstatt die volle Matrix zu verwenden, aber das Problem ist immer noch vorhanden - wie kann ich sie in 1 globalen Matrix kombinieren?

Der Code, den ich verwende (fand einige Links dafür):

%Vor%

Hier empfange ich 121 statt 151 Matrix - aber die Dauer einiger Matrix-Transformationen dauert mehr als die Dauer von 1 Frame-Draw, also denke ich, dass die Q-ty hier auch richtig ist

%Vor%

Ich denke, dass Autodesk SDK es gibt eine Möglichkeit, eine globale Transformation für jeden DrawCall

zu bekommen

Irgendwelche Vorschläge? Ist das möglich?

Bounty für jeden, der beschreiben kann, wie Animationen auf dem iPhone in openGLES 2.0 mit Autodesk SDK angezeigt werden ... ( sorry typo statt Facebook )

Hier, was ich bekommen kann

Ursprüngliches Objekt in blender

Wenn ich Knochen separat zeichne (gleicher VBO mit verschiedenen Transformations- und nur Indices für jeden Knochen entsprechend)

    
gbk 15.08.2016, 08:19
quelle

1 Antwort

4

Hier können Sie animiertes Mesh in OpenGL ES rendern. Dadurch erhalten Sie Informationen zu den Details, die Sie aus der Datei lesen müssen.

Methode 1: (GPU-Skinning)

Diese Methode funktioniert nur mit einer begrenzten Anzahl von Bones, basierend auf den Fähigkeiten der Hardware. Normalerweise hängt es von der Anzahl der Matrizen ab, die Sie an den Shader senden können.

Binden Sie die Mesh-Informationen einmal mit BindAttributes an die GPU und senden Sie die Matrizen uniform an den Shader.

Schritt 1: Lies alle Bone Matrix und erstelle ein Array von Matrizen und sende diese Daten in Uniformen an den Shader.

Schritt 2: Berechnen Sie im Vertex Shader die gl_position wie den unteren Shader

%Vor%

In diesem Shader habe ich die Gewichtsfarbeninformationen in den Attributen optionalData1 & amp; optionaleDaten2. Die Daten sind wie folgt gepackt: (BoneId1, BoneId2, BoneId3, BoneId4) und (Weight4Bone1, Weight4Bone2, Weight4Bone3, Weight4Bone4). In diesem Fall sind Sie auf maximal 4 Bones beschränkt, die sich auf die Attribute auswirken. Der Fragment-Shader-Teil ist üblich.

Methode 2: (CPU-Skinning)

Wenn Sie mit der Beschränkung beim GPU-Skinning nicht leben können, besteht die einzige Möglichkeit darin, die Berechnungen auf der CPU-Seite durchzuführen.

Schritt 1: Berechnen Sie die Eckpunktposition im aktuellen Rahmen, indem Sie die Matrizen multiplizieren, die zu den Bones gehören, die den Eckpunkt betreffen.

Schritt 2: Sammeln Sie die neuen Positionen für das aktuelle Bild und senden Sie die Informationen an die GPU in Vertex-Attributen.

Schritt 3: Berechnen Sie neue Scheitelpunktpositionen in jedem Bild neu und aktualisieren Sie den Attributpuffer.

Diese Methode bringt die Last der Berechnungen in die CPU.

    
codetiger 26.08.2016 05:31
quelle