このプロジェクトは、間違いなく私の最も進んだプロジェクトの 1 つです。私は、Twilight Princess (Nintendo GameCube) の Web BMD ビューアーのプログラミングを始めました。このゲームが大好きで、ゲーム プロデューサーとして、レベルを分析し、その作成方法の詳細に没頭することに夢中になっているからです。このプロジェクトは、私にとってその情熱を探求し、大好きなゲームをより深く理解するための方法です。やりがいのある、やりがいのある学習体験です。このプロジェクトが私をどこへ連れて行ってくれるのか、その過程でどんな新しい発見ができるのか、楽しみです。これまで、このプロジェクトには数か月もの調査を要しました。この調査は、rarc、bmd、gcm yaz0、j3d、tev などについて調査し、知識と発見を共有してくれた 20 人以上の人々の作業に基づいています。私は、ある人物に出会ったので、その人物の功績を記してクレジットを付与しました。
先駆的な取り組みに対して、(「LordNed」、「thakis」、「Jasper St. Pierre」、「Kiwi」、「Dolphin Emulator Team」、「Gamma」、「Zan」) に感謝します。
水、霧、アニメーションテクスチャは現在ロードマップ上の機能です
このプログラムは three.js と webGL を使用してプログラムされています。Chrome ブラウザでは 60fps で一定に動作します。残念ながら、インタラクティブ ビューアー (モデル、部屋など) を皆さんと共有することはできません。研究の公正使用の限界がどこまでなのか知りたくないからです。私のモンタージュをお楽しみください:
https://api.fenixfox-studios.com/assets/d43523dd-5cbe-4da4-9c7d-2d275690050a
BMD と BDL は、任天堂が GameCube および Wii ゲームのモデル データを保存するために使用するファイル形式です。これらは、より大きな JSYSTEM ツールキットのコンポーネントである任天堂の J3DGraph ライブラリの一部です。BMD は、ゲーム Luigi's Mansion で初めて登場しました。その後、Super Mario Sunshine で使用された唯一のモデル形式になりました。Wind Waker では、さらに BDL 形式が導入されました。これは、BMD の拡張で、MDL3 と呼ばれるマテリアル FIFO 命令用の追加セクションがあります。MDL3 は、レンダリング効率を向上させるために使用されます。Super Mario Galaxy 2 は、このモデル形式を使用した最後のゲームでした。
JSYSTEM は、任天堂が自社のコンソール用のゲームを作成するために使用する独自のゲーム開発ツールキットです。3D モデリング、アニメーション、物理などのタスク用のさまざまなライブラリとツールが含まれています。J3DGraph は JSYSTEM 内のライブラリで、3D グラフィックスを処理する機能を提供し、BMD および BDL ファイル形式を担当します。BMD は Binary MoDel の略で、BDL は Binary Display List の略です。
JSYSTEM ツールキットは、リバース エンジニアやゲーム モッダーによって 2000 年代初頭に発見されました。彼らは、任天堂のゲームキューブや Wii のゲームのコードを解析し、逆コンパイルし始めたのです。彼らは、多くのゲームが類似したコード構造とライブラリを共有していることを発見し、共通の開発ツールキットが存在するのではないかと疑いました。多くの調査と実験を経て、彼らはゲームから JSYSTEM ライブラリを特定して抽出することができ、J3DGraph ライブラリや BMD および BDL ファイル形式など、さまざまなコンポーネントの文書化とリバース エンジニアリングを開始しました。
JSYSTEM の理解が深まるにつれ、モッダーたちは JSYSTEM フォーマットで作業するための独自のツールを開発し始め、独自のカスタム モデルやテクスチャを作成し、さらには JSYSTEM ライブラリを使用して新しいゲームを作成するようになりました。これにより、活気のあるモッディング コミュニティが生まれ、現在も存続しており、多くのモッダーがオンラインで発見やツールを共有しています。
当初、私は実際の *.dol または *.gcm コンテナ形式にはあまり興味がありませんでした。なぜなら、他の人たちが既にすぐに使えるツール (後に自分で gcm リーダーを作成) を提供していたからです。少し検索してみると、部屋やその他の要素など、興味深いものが含まれていそうなフォルダーを見つけました。Faron Woods などの大きなエリアはチャンクに分割され、個別のファイルに保存され、後で結合されて完全なエリアを形成します。
しかし、私は簡単なものから始めたかったのです。おそらく、何か簡単なものでしょう! フォルダ内のほとんどのものを解凍した後、ファイルをサイズ順に並べ替えると、非常にシンプルなオブジェクトが見つかりました。 HexWorkshopでファイルを確認すると、VTX、INF、DRW、SHP などのマーカーが見つかりました。頂点の位置から、シンプルなドアノブが付いた平らな箱であることがわかりました。すぐに、それが湖底の寺院のドアであることに気付きました。
オブジェクトがどのように見えるかはわかっていましたし、頂点座標やテクスチャ情報などの基本情報をどこで探せばよいかもわかっていました。
一部の情報はあなたのケースでは単純に間違っているので注意が必要です。特定の属性は、ドキュメントに記載されている内容と異なっていました。しかし、そのようなフォーマット シートがあれば、3D モデルとそのテクスチャを抽出するのに必要なのはそれだけです。
少なくとも 1 つの単純なオブジェクトを抽出する試みに成功したので、さらに掘り下げて、エリア全体に取り組む時が来たと思いました。先ほど書いたのと同じアルゴリズムを使用して、R00_00 という名前のファイルを選択しました。Ordon Village または Faron Woods であることを期待していました。しかし、それは問題ではありませんでした。得られたのはゴミの山でした。明らかに、頂点の順序が間違っています。この画像を見て、どの部屋かわかりますか?
少しずつ形を確かめながら、ゆっくりと水面を確かめていきました。あちこちに崖や墓石が見え始めました。カカリコ墓地のエリアを見ているのが明らかになりました。
かなりの時間を経て、次のような結果になりました。特定のオブジェクトが欠落し、一部の面が反転し、テクスチャが 1 つも正しく適用されていないようでした。
解決策はややわかりにくいものでした。特定のシェイプには特定のマテリアル インデックスが定義されていましたが、それらは単純な 1:1 関係ではありませんでした。代わりに、BMD ファイルの INF セクションで定義されているシーン階層を確認する必要がありました。この階層は、シェイプまたはマテリアルのいずれかを表すノードのツリーで構成されていました。通常、階層はマテリアルで始まり、その後にシェイプが続きます。たとえば、(mat1、shp2、shp5、shp6、mat2、shp1、shp12...) のようになります。この場合、シェイプ 2、5、6 はすべてマテリアル 1 を使用するということになります。
まあ、素晴らしいですが、そのゲームをプレイしたことがある人なら誰でも、マテリアルがおかしく見えることに気付くでしょう。色がおかしく、マテリアル間のブレンドがなく、全体的にかなり暗く見えます。この時点で、私はこのすべての中で最も衝撃的な部分に飛び込んでいたでしょう。GameCube は、TEV ステージ、つまりテクスチャ環境ステージを使用してこれらのタスクを処理します。TEV ステージは、テクスチャのブレンド、色の管理、透明効果の適用を担当します。GameCube は、2 つのレンダリング パスと遠くのオブジェクトを最初にレンダリングする、今日知られているような透明効果を実際にはサポートしていなかったことに注意してください。GitHub リポジトリ、記事、フォーラム スレッドがいくつかあります。できるだけ多くの情報を入手してください。
追加する必要があったもう 1 つの重要な部分は、霧、ブルーム、雲などの大気効果でした。この時点では、霧とブルーム効果をうまく作成できませんでしたが、雲の影を見つけて、それをブレンディング TEV ステージに配置しました。雲の正しい UV 座標をまだ探しています。
その部屋の最終結果は次のようになります: (実際、ここまで来るのにかなり時間がかかりました)
このプロジェクトは素晴らしい旅でした。過去の技術的制限を賢い人々がどのように解決したかを考えることに時間を費やしたことで、トワイライト プリンセスの複雑な美しさを理解することができました。順調に進んでいますが、まだ調査して実装すべきことが山ほどあります。このビューアをできるだけ正確で没入感のあるものにするために、霧、BTK (テクスチャ アニメーション)、その他の大気効果などの機能を追加しながら、作業を継続する予定です。