ある日、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にエクスポートできます。同じノエシスを通して。