フォーマットの分析:内部からの3Dモデル

画像



日曜日の夏の夜の構文解析フォーマットに関する別の記事は、小さくて面白いです。 今回は3Dモデルに焦点を当てます。 データストレージの原則はどのモデルでも同じですが、ファイル形式は非常に多様です。 同じエンジンの条件でも、開発者はすべてを修正し、独自の何かを突き出すよう努めます。商用バージョンでは、エンジンコードを変更する能力があり、通常はそれを使用するからです。



モデルファイルの大部分は、頂点、それらの接続方法、およびテクスチャがそれらにプルされる方法に関するデータを含むいくつかの大きなテーブルで構成されています。 トップから始めましょう。 x、y、z座標の単純なリストは次のようになります。







ほとんどの場合、座標は32ビット浮動小数点数の形式であるため、40〜45の範囲で4バイトの数字を繰り返したり、C0〜C5の負の数値を繰り返したりすることで、ファイル内で簡単に認識できます。 もちろん、他のバイトもありますが、これらはほとんどの場合です。 これは、3Dモデルの座標範囲が順序の点で小さく、順序が上位バイトに格納されているためです。



次に、頂点が三角形に接続される順序で示されるテーブルが必要です。 ほとんどの場合、次のようになります。







これらは3つのグループの16ビットの頂点番号です。 モデルには通常、数百の頂点しかないため、これらの数値は小さく、そのようなテーブルも視覚的に簡単に見ることができます。 この例では、番号50.51および52の頂点で構成される三角形の1つが選択されています。



3番目は、頂点を引っ張る必要があるフラットテクスチャに頂点をスナップするためのテクスチャ座標のテーブルです。







テクスチャ内のx座標とy座標は0〜1の範囲に縮小され、テクスチャのサイズが2048x2048または4096x4096の場合、高精度のポイントはありません。 したがって、それらはほとんどの場合、半精度の 16ビットの浮動小数点として保存されます。 取得する上位バイトは0x30よりわずかに大きく、場合によっては0x40またはそれ以上に達することがあります。 ここでは、テクスチャ座標は赤とオレンジで強調表示され、照明マップ上の座標は緑と明るい緑で強調表示されます。



これらのテーブルが見つかったら、要素の数を計算し、この数量が格納されている場所と、構造全体の記述方法を見つけることができます。 しかし、ファイル内のこれらのテーブルに加えて、それらが何であり、何を意味するのかわからない多くの小さなあいまいな数字が必ずあります。 たとえば、人体モデルを含むファイルの中央には、3つの浮動ユニットがあります(緑色で強調表示されています)。







どういう意味ですか? はい、それらを変更して、何が起こるかを見てください。 代わりに1.5を書き、ゲームを開始します







もちろん、これは規模です。 興味深い効果は、アニメーションが他のファイルに別々に記録され、モデルの座標に関連付けられているという事実から得られます。そのため、このような奇妙なフリークが発生します。 男は子供と一緒に広場の肩に座っています。 今、彼は胸の中にいました。 バリアの前にいる人は、理解できない動きをして、実際に拍手を送ります。



次に、幅と高さがどこにあるかを判断してみましょう。 最初の1つの数値のみを変更します:10倍に減らします。







したがって、実験して、残りの数値を決定できます。 それらの一部を変更しても何も起こらない場合は、そのままにしておきます。 たぶん、なぜそれらが必要なのか決してわからないでしょう。 そして、ある日突然彼らが自分自身を感じさせるなら、それを整理します。



exe-shnikを勉強するよりもファイル形式の分析が分析的に簡単で速い場合の1つの例を次に示します。exe-shnikでは、このすべての情報をビデオサブシステムに供給するコードの荒野で迷子になります。



All Articles