古代のアニメーション圧縮フォーマットの解凍

画像



ある日、Vocaloidプログラムのキャラクターに関連するさまざまなビデオをYouTubeで見ました(正確な説明ではありませんが、これからは単にVocaloidと呼びます)。そのようなビデオの1つは、ゲーム「初音ミク:Project DIVA2nd」のいわゆるPVでした。つまり、ボーカロイドのメグリン・ルカとカガミネ・リンが演じたアイドルマスターの歌の関係。どちらのキャラクターもCryptonFutureMediaのものです。ネットをサーフィンした後、誰もこのゲームのアニメーションを変換できないことに気づきましたか?しかし、なぜ?カットの下でこれについて。



ゲーム自体は、Intrinsic Graphicsによって開発され、後にVicariousVisionsによって購入されたAlchemyEngineを使用しています。これは、拡張子が「.igb」のファイル(以下、IGB)と、それに対応する行から確認できます。ファイル自体はバイナリです。少しグーグルすると、Comradeのスクリプトを見つけました。特定のサークルでよく知られているNoesisプログラムのminmode。スクリプトをフォルダにスローして起動し、アニメーションファイルを開こうとすると...カボチャを取得します。 同志として。 DeviantArtに関する彼の投稿のminmodeでは、このスクリプトは一部のEnbayaによって圧縮されたアニメーションを読み取ることができません。 Googleの特許では、似たようなものしか見つかりませんでした。特許自体はすでに19〜20年前のものなので、圧縮アルゴリズム自体も古いと思います。そしてサイト自体



画像



これについてもヒントがあります(Webアーカイブからのみ入手可能)。もう少し調べてみると、このアルゴリズムがEnbaya社の特定のProGATEの一部であることがわかりました。しかし、それは私たちに何も与えません。



IGBに戻りましょう。見つけたIGBコードを書き直し、C#でNoesisスクリプトを使用することで、状況が明確になり始めました。



以下に、このゲームのIGBファイルに並べられた要素の表を示します(不器用で申し訳ありません。他の方法ではできません)。必要な要素のみを示します



明確化-*リスト-要素の配列*



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


このようにして、私はさらなる研究のために生データを手に入れることができました。 PPSSPP、Ghidra、およびそのプラグインの助けを借りて、私はゲームバイナリの研究を始めました。必要な機能をどのように見つけたかは正確には覚えていませんが、ULJM05681 [またはNPJH50300]のEBOOT.BINから特定の機能を提供します(この場合、これは最初のProject Diva 2番目であり、2番目ではありません。いわゆるバーゲンバージョンまたはProject Diva 2番目#) :



0x08A08050-igDataからのヘッダーに基づく解凍関数の初期化0x08A0876C-

特定の時間でのデータの要求(はい。Enbayaはフレームではなく時間で動作します)。



コード自体は逆コンパイルされ、GitLabに投稿されます Cで書かれています。 VisualStudioとgccの両方でコンパイルします。 x86とx64の両方で動作します。



アルゴリズム自体については説明しません。私のコードは私にもっとよく教えてくれます。



しかし、要するに、エンバヤは変位とクォータニオンデータにデルタを使用します。以前の/現在のデータに/を加算/減算するだけでデルタを適用します。翻訳はそのままで、クォータニオンは後で使用できるように正規化されます。このアルゴリズムを使用すると、ファイルをリロードせずに時間を遡ることができます。さらに、フレームレートではなく、1秒あたりのサンプル数で動作します。これを行うために、前のサンプルと次のサンプルの2つの状態をメモリに格納し、エンジン自体がそれらの間の値を補間します。ただし、ファイル内のあらゆる場所に整数形式のデータがあるため、小数を取得するには、データを何かで除算する(より正確には、たとえば0.0002で乗算する)必要があります。この番号はタイトルに示されています。この除算(実際には乗算ですが、本質ではありません)のため、加算と減算のたびに、精度が少しドリフトします。



そしてそれがすべてです。正直なところ、すべてを逆にするのは楽しかったです。私の仕事が無駄にならなかったことを願っています。



PS igSkeletonデータを使用すると、完成したアニメーションを取得して、たとえばMayaにエクスポートできます。同じノエシスを通して。






All Articles