世界を動かす技術を、日本語で。

1993年のようにグラフィックスを作成する

概要

Catlantean 3D は、90年代初期の技術制約を再現しつつ現代の開発環境で制作中の FPSゲーム320x240解像度・256色パレット など厳しい制限下で、資産制作や描画技法を工夫。 パレット管理・コローマップ・アセット制作 の詳細な解説。 BlenderやPython を活用した効率的なスプライト生成。 開発中の工夫や課題 についても言及。

Catlantean 3D開発の挑戦

  • Catlantean 3D は、 趣味プロジェクト として1年以上かけて開発中
  • Steamで来年リリース予定
  • 90年代FPS の技術的制約を再現しつつ、現代的なコンパイラや抽象化レイヤーを利用
  • 自作エンジン・自作アセット のみ使用
  • 手描きレンダリング・手動サウンドミキシング
  • 320x240ピクセル・256色パレット という厳格なグラフィック制限
  • ゲームロジックは固定小数点演算 でプラットフォーム間の挙動を保証
  • プラットフォーム抽象化レイヤー は最小限の機能(フレームバッファ・入力・オーディオバッファ・ファイルI/O)
  • AIの簡易化や手抜き無し
  • 完成度の高い「遊べるゲーム」 を目標、単なる技術デモではない

パレットレンダリングとVGAグラフィック

  • VGA Mode 13h (320x200, 256色)は90年代PCゲームの象徴的なグラフィックモード
  • 1ピクセル=1バイト でパレットのインデックスを指定
  • 現代のゲーム資産制作 では無数の色を使えるが、 256色制限 下では色選びが極めて重要
  • DoomやDuke Nukem のような作品はこの制限を活かした好例
  • Catlantean 3D では VGA Mode-X(320x240) を採用
    • 4:3ディスプレイ でピクセルが正方形になるため
  • 資産制作 では制限を意識した慎重な色選択が必要

パレット設計

  • 768バイト (256色×RGB各1バイト)のパレットを手作業で調整
  • 透明色・白・黒 をそれぞれ1色ずつ確保
  • 血の表現用の赤系、カギや扉用の緑・青系
  • 舞台設定(Catlantis=古代エジプト風パロディ)用の黄色・茶系
  • 技術施設用のグレー系、単調さ回避のベージュ系
  • テクスチャ制作時に都度追加・調整
  • パレットは試行錯誤を繰り返しながら進化

コローマップとライティング

  • Catlantean 3D は伝統的な レイキャスター方式 を採用
  • DDAアルゴリズム で壁当たり判定・テクスチャサンプリング
  • 床・天井は水平方向のスキャンラインで描画
  • ライティング表現 が重要ポイント
    • 距離に応じて色を暗く することで奥行き感を演出
    • パレットレンダリング では色自体はインデックスなので、 暗い色を高速に引く工夫 が必要
  • コローマップ という2次元配列を事前計算
    • 各色ごとに32段階の暗さバリエーション
    • Oklab色空間 で人間の知覚に近い色距離を計算
    • 暗くするほど暖色側に色相シフト (ピクセルアートの定番テクニック)
  • 描画時はO(1)で暗い色を取得
    • 壁は縦1列ごと、床は横1列ごと、スプライトは1体ごと に計算すればよい
    • Doom等の名作でも類似手法

アセット制作フロー

  • Catlantean 3Dのテクスチャ・スプライト は3種類
    • プリレンダースプライト :Blenderで3Dモデル制作→アニメーション→Pythonスクリプトでテクスチャ化
    • 手描きスプライト・テクスチャ
    • プロシージャル生成テクスチャ :手描き素材をPythonスクリプトで合成
  • プリレンダースプライト のメリット
    • アニメーションの再調整が容易 (モデル修正→一括レンダリング)
    • Blenderのノードやコンポジット機能 でコントラスト・エッジを最適化
    • Pythonスクリプトでパレット化・TEX形式に変換
      • Oklabで最も近い色を自動選択
  • 敵キャラスプライト は8方向×各アニメーションフレームを自動レンダリング
  • ノード構成は冗長でも再利用性重視でそのまま残す方針

資産制作の工夫と今後

  • Blender・Python API の活用で 省力化とクオリティ両立
  • パレット制限下での色設計やライティング表現 に独自ノウハウ
  • 「制約があるからこそ生まれる美しさ」 を追求
  • 今後もパレットやアセットは随時改良予定
  • ワークインプログレス であり、今後大きく変更される可能性も示唆

まとめ

  • Catlantean 3D は、 懐かしさと現代的な工夫 が融合したFPS
  • 厳しい技術制約 を逆手に取り、 美しさや遊びやすさ を追求
  • パレット管理・レンダリング・資産制作 における具体的なノウハウを共有
  • 今後の進捗や改良にも期待

Hackerたちの意見

これはDoomからかなりインスパイアを受けてるけど、実際のレイキャスティングエンジンはDoomの前の作品に近いんだよね。最も有名なのは多分Wolfenstein 3Dかな:壁が直角で、床と天井の高さが一定。Wolf3Dはパフォーマンスの理由でテクスチャ付きの床と天井がなかったけど、他の似たようなゲームにはあったよ。Doomや、確かDuke NukemもBSPエンジンを使ってて、もっと柔軟だったんだ(壁がどんな角度でも交差できて、床と天井の高さも変えられる)。でも、レベルはまだ「フラット」だったから、レベル内に複数の「階層」を作ることはできなかった。例えば、歩いて渡ったり、下をくぐったりできる橋をデザインすることはできなかったんだよね。

最初はただのスキンを変えたWolfenstein 3Dだと思ったけど、それはかなり不公平だね。ここにはたくさんの作業があるよ。

後にShadow Warriorではそれができたんだよね。ポータルを使って実装してたと思うけど、エディターで設定するのがめっちゃ大変だったのを覚えてる。

Wolf3Dはパフォーマンスの理由でテクスチャ付きの床と天井がなかったけど、他の似たようなゲームにはあったよ。Blake StoneやRise of the TriadはWolf3Dエンジンの後のバージョンを使ってて、テクスチャ付きの床と天井があった。 Doomや、確かDuke NukemもBSPエンジンを使ってて、もっと柔軟だった。Duke Nukem(Buildエンジン)はBSPを使ってないよ。 https://www.jonof.id.au/forum/topic-137.html#msg1548

Duke NukemもBSPエンジンを使ってた。BuildエンジンはBSPを使ってなくて、セクター間の接続をポータルとして扱い、壁を(90度回転した)台形としてラスタライズしながらポータルに対してクリッピングを行ってたんだ。これにより動的な壁のジオメトリ(例えば、動く電車や回転する照明器具など)が可能になったし、「部屋の上に部屋」を作ることもできた。ただし、両方の部屋を同時に見ることができない場合に限るけど。(BloodやShadow Warriorでは、同じ形のセクターを作って、一方のセクターの床がもう一方のセクターの天井へのポータルとして機能する方法を見つけて、より「3D」な空間を作ることができたんだ。これはエンジンによって「ネイティブ」にサポートされていたわけではないけど、使っていたゲームスタジオが自分たちでやれるくらい柔軟だったんだよね。ソースコードにアクセスできなくてもね)。Duke Nukem 3Dの最初のレベルではいくつかのBuildのトリックが使われてるよ。例えば、スプライトがカメラに従わずに「軸に沿った」配置ができたり、衝突判定を持つこともできる。これを利用して、各スプライトを軸に沿った四角形として扱うことで、初めのレベルでは二つの建物の間に橋を作るために使われてるんだ(レベルの出口ボタンのすぐ前にね)。

同じように「無茶な制約のある3Dエンジン」を開発している者として、ここでの説明の詳細さや、君が辿ったプロセスを見るのが好きだよ。

これ、女性主人公の珍しいシューティングゲームの一つかもしれないって気づいたよ。猫が三毛猫の模様をしてて、ほとんどがメスなんだよね。(https://en.wikipedia.org/wiki/Calico_cat)

最近のブーマーシューティングゲームには女性主人公が多いよね。例えば、Selaco[0]、Supplice[1]、The Citadel[2]とその続編[3]、Zortch[4](その続編も[5])、Nighmare Reaper[6]、COVEN[7]、Viscerafest[8]、Hedon[9]とか。今は女性主人公のブーマーシューティングゲームの方が多いって言えるかもね :-P (Steamで「ブーマーシューティング」と「女性主人公」のタグを組み合わせると143件の結果が出るけど、キャラクターの性別を選べるゲームや、ほとんどは男性だけど一部女性としてプレイするゲームも含まれてるよ。)[0] https://store.steampowered.com/app/1592280/Selaco/ [1] https://store.steampowered.com/app/1693280/Supplice/ [2] https://store.steampowered.com/app/1378290/The_Citadel/ [3] https://store.steampowered.com/app/3371240/Beyond_Citadel/ [4] https://store.steampowered.com/app/2443360/Zortch/ [5] https://store.steampowered.com/app/3807500/Zortch_2/ [6] https://store.steampowered.com/app/1051690/Nightmare_Reaper/ [7] https://store.steampowered.com/app/1785940/COVEN/ [8] https://store.steampowered.com/app/1406780/Viscerafest/ [9] https://store.steampowered.com/app/1072150/Hedon_Bloodrite/

女性主人公の珍しいシューティングゲームの一つ いや、これはパーフェクトダークのゲームじゃないよ。

女性主人公のレアなシューティングゲームって、そんなに珍しくないよね? 思いつくのは、かなりメジャーなところで、Perfect Dark、Mirror's Edge、Dishonored(どっちが最初かは忘れたけど)、Metroidとか、女性主人公の「シューティングゲーム」って感じかな。ただ、Mirror's Edgeは「シューティング」よりも「一人称視点」って言った方が正確かもね。 それに、「RPG + FPS」のジャンルでは、男女どちらでも選べるゲームがたくさんあるし。 --------- 作者も猫のパターンと性別について気づいてるみたいだね: > 結局、主人公にはちゃんと分け前をあげないといけないからね。 [画像] (そう、女性だって分かってるけど、方言に根ざした慣習ってことで。)

これ、すごいね!こういうプロジェクトのクリエイティブなプロセスについて読むのが大好きなんだ。自分で決めた制約に対してクールな解決策を見つけるのって面白いよね。理論的な理由と「なんかいい感じ」っていう感覚の組み合わせが最高だと思う。多くの決定に対してしっかりした基盤を与えつつ、個性的な美学も生まれるし。ほんとにクールだね。

この記事、めっちゃ好きだった!ゲームを作るのはいつもすごく大変そうに感じてたんだ。やり方がよくわからないし、いろんなプロセスがあるからね。ここで説明されている解決策は、シンプルな制約の中でとてもコンパクトで理解しやすいし、それでいて見た目もいいゲームができるんだよね。

これ、めっちゃいいね!オリジナルのBBCエリートをマルチプレイヤーネットワークで再現する似たようなプロジェクトに取り組んでるんだ。でも、あんまり制約をかけてないよ(SDLを使ってるし)。

敬意を表します!最初にアニメGIFを見たとき、既存のゲームエンジン(例えば、DoomやWolf 3D)のためにアセットをゼロから作るプロジェクトだと思ったけど、実際にはゲームコードもゼロから作ってるんだね!(昔の技術を使ってるけど)。素晴らしい仕事だよ。

タイトルを見てDeluxePaintについてのメモを期待してたけど、それでも楽しい読み物だったよ。ゲームの成功を祈ってるよ! :-)

1990年代初頭から中頃のグラフィックスプログラミングはすごく楽しかったよ:メモリマップされたビデオRAMにピクセルデータを書き込むと、画面に表示されるんだ!0xA0000へのポインタがあれば十分で、APIとかは必要なかった。彼らが言ってる非正方形ピクセルの320×200 VGAモードの理由は、ビデオバッファが64000バイトで、16ビットセグメントに収まるから、16ビットコード/CPUでのアドレス指定が簡単だったんだ。

0xA0000へのポインタさえあれば十分だったよ。 でも、拡張モジュールがあるとちょっと面倒になることもあるけどね :-P (DJGPPやFree Pascalは、DJ Delorieの「go32」拡張モジュールを使ってるけど、完全なリニアマッピングをしてないから、画面に表示するためにはもう少し手間がかかるんだ。)

これはあなたのプロジェクトについての素晴らしい深掘りだね。今、ピクセルアートスタイルの手続き型アートシステムを作り始めたばかりなんだけど、これを読んで考えることがたくさんできたよ。