Dekomprimieren des alten Animationskomprimierungsformats

Bild



Eines Tages habe ich auf YouTube verschiedene Videos gesehen, die sich auf die Charaktere des Vocaloid-Programms beziehen (keine genaue Beschreibung, aber von nun an werde ich es einfach Vocaloid nennen). Ein solches Video war die sogenannte PV aus dem Spiel Hatsune Miku: Project DIVA 2nd. Nämlich die Song-Relationen von The Idolmaster, die von den Vocaloiden Megurine Luka und Kagamine Rin aufgeführt wurden. Beide Charaktere stammen von Crypton Future Media. Nach dem Surfen im Internet wurde mir klar, dass niemand die Animationen aus diesem Spiel konvertieren konnte? Aber warum? Darüber unter dem Schnitt.



Das Spiel selbst verwendet die Alchemy Engine, die von Intrinsic Graphics entwickelt und später von Vicarious Visions gekauft wurde. Dies ist aus den Dateien mit der Erweiterung ".igb" (im Folgenden - IGB) sowie den entsprechenden Zeilen darin ersichtlich. Die Dateien selbst sind binär. Ich googelte ein wenig und fand ein Drehbuch von Genosse. Minmode für das bekannte Noesis- Programm in bestimmten Kreisen . Wir starten es, mit dem Skript in den Ordner geworfen, versuchen die Animationsdatei zu öffnen und ... Wir bekommen den Kürbis.



Bild



Wie Genosse erklärte. Minmode in seinem Beitrag auf DeviantArt kann dieses Skript keine von Enbaya komprimierten Animationen lesen. Bei Google Patents konnte ich nur ähnliche finden . Die Patente selbst sind bereits 19 bis 20 Jahre alt, daher gehe ich davon aus, dass der Komprimierungsalgorithmus selbst ebenfalls uralt ist. Und die Seite selbstHinweise auch dazu (nur über das Webarchiv verfügbar). Nachdem ich ein wenig mehr gesucht hatte, stellte ich fest, dass dieser Algorithmus Teil eines bestimmten ProGATE der Firma Enbaya war. Aber das gibt uns nichts.



Kehren wir zum IGB zurück. Durch Umschreiben des IGB-Codes, den ich finden konnte, und Verwenden des Noesis-Skripts in C # wurde das Bild klarer.



Im Folgenden werde ich eine Tabelle mit Elementen geben, wie sie in den IGB-Dateien in diesem Spiel aufgereiht war (Entschuldigung für die Unbeholfenheit. Ich kann nichts anderes tun). Ich werde nur die Elemente geben, die wir brauchen.



Klarstellung - * Liste - ein Array von Elementen *



igAnimationDatabase
--igSkeletonList
---igSkeleton - , , ,   
----igSkeletonBoneInfoList
-----igSkeletonBoneInfo -  
--igAnimationList
---igAnimation -  
----igAnimationBindingList
-----igAnimationBinding -   igSkeleton.      
----igAnimationTrackList
-----igAnimationTrack -   
------igEnbayaTransformSource
-------igEnbayaAnimationSource
--------igData -      Enbaya
igData -   ,     .


Auf diese Weise konnte ich die Rohdaten für weitere Studien in die Hände bekommen. Mit Hilfe von PPSSPP, Ghidra und einem Plugin dafür begann ich, die Spielbinärdatei zu studieren. Ich erinnere mich nicht genau, wie ich die erforderlichen Funktionen gefunden habe, aber ich werde bestimmte Funktionen von EBOOT.BIN von ULJM05681 [oder NPJH50300] angeben (in diesem Fall ist dies die erste Project Diva 2nd und nicht die zweite, die sogenannte Bargain Version oder Project Diva 2nd #). :



0x08A08050 - Initialisierung der Dekomprimierungsfunktion basierend auf dem Header von igData

0x08A0876C - Anforderung von Daten zu einem bestimmten Zeitpunkt (ja. Enbaya arbeitet mit Zeit, nicht mit Frames).



Der Code selbst wird dekompiliert und auf GitLab veröffentlicht . Es ist in C geschrieben. Kompiliert sowohl in Visual Studio als auch in gcc. Funktioniert sowohl in x86 als auch in x64.



Ich werde nicht auf den Algorithmus selbst eingehen. Mein Code wird es Ihnen besser sagen.



Kurz gesagt, Enbaya verwendet Delta für Verschiebungs- und Quaternionsdaten. Es wendet das Delta an, indem es einfach zu / von den vorherigen / aktuellen Daten addiert / subtrahiert wird. Die Übersetzung bleibt unverändert und die Quaternion wird für die spätere Verwendung normalisiert. Mit dem Algorithmus können Sie in die Vergangenheit reisen, ohne die Datei neu laden zu müssen. Darüber hinaus arbeitet es nicht mit einer Bildrate, sondern mit Abtastwerten pro Sekunde. Zu diesem Zweck werden zwei Zustände im Speicher gespeichert - der vorherige und der nächste, und die Engine selbst interpoliert den Wert zwischen ihnen. Aufgrund der Tatsache, dass wir Daten überall in ganzzahliger Form in der Datei haben, müssen wir sie durch etwas teilen (genauer gesagt, multiplizieren Sie sie beispielsweise mit 0,0002), um eine Bruchzahl zu erhalten. Diese Nummer ist im Titel angegeben. Aufgrund dieser Division (eigentlich Multiplikation, aber nicht der Essenz) driftet die Genauigkeit bei jeder Addition und Subtraktion ein wenig.



Und das ist alles. Um ehrlich zu sein, hatte ich Spaß daran, alles umzukehren. Ich hoffe, dass meine Arbeit nicht umsonst war.



PS Mit den igSkeleton-Daten können wir die fertige Animation bereits abrufen und beispielsweise nach Maya exportieren. Durch die gleiche Noesis.






All Articles