
2026/06/09 19:46
1993 のグラフィックを作るかのように
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
サマリー:
Catlantean 3D は、1 年間の余暇に 걸쳐情熱的に開発されたプロジェクトであり、2027 年初頭における公式な Steam リリースを目指しています。古代エジプトのサイバーパンクパロディである Catlantis を舞台とし、厳格な技術的制約の下でレトロな魅力と現代の革新性を融合させています。
視覚的には、プリレンダリングされた Blender モデルと手描きの Aseprite スプライトを組み合わせ、ハイトマップ、ノイズ、汚れを用いた手続き生成テクスチャ(procedurally generated textures)や、Voronoi 分解および物理シミュレーションを利用した複雑な手続き的なデスマニペーション(complex procedural death animations)を実装しています。DDA アルゴリズムを使用したカスタム実装のレイカッストリングエンジン上で動作し、320x240 の解像度と 256 カラーによりスクエアピクセルを確保しています。主要な技術的達成事項としては、浮動小数点精度と組み合わせた決定論的なレンダリングロジックが挙げられます。エンジンは、Olabk(※原文「Oklab」の誤記と考えられるため)距離を利用した革新的なパレット管理システムを搭載し、色認識の正確さを保証するとともに、 colormap ルックアップテーブルを使用した動的照明アルゴリズムを採用し、ループ処理なしで O(1) パフォーマンスを実現しています。
本プロジェクトには、高度な照明機能やフラグペイントイングを支援するカスタム Python ベースのマップエディタ(wxPython/pybind)が含まれています。最終製品は設定不要であることがありながら、5 ドルから 8 ドルの価格帯で提供され、コンパイル済みバイナリアーカイブとして配布されます。コミュニティ精神に倣い、開発者は GitHub 上で全体のコードベースを開源化することを計画しており、レイカッストリングエンジンや手続き的なコンテンツ生成を調査する愛好家に貴重な洞察を提供します。
本文
Catlantean 3D:90 年代技術と現代手法を融合した FPS オープンソース開発の記録
Catlantean 3D は、1 年以上かけて開発された私のサイドプロジェクトです。来年には Steam で公開することを計画しています。このゲームは、90 年代初頭に一般的だった技術を駆使しつつも、現代のコンパイラやプラットフォーム抽象化レイヤを活用するという「贅沢」を許容しています。
目標と制限条件
私が設定した厳格な制限条件は以下の通りです:
- 全自制: ゲーム全体のアセット(グラフィック、音源など)を全て自前で制作する。
- 手作業による表現: レンダリング、ミックスされた全ての音源、マップ編集をすべて手書きで行う。
- レトロな解像度と色数: 画解像度は 320x240、色数は 256 色 に制限。
- 計算の制約: ゲームロジックは固定小数点を使用(決定論的振る舞いの確保)、レンダリングのみ浮動小数点使用。
- プラットフォーム抽象化の制限: フレームバッファ、入出力、オーディオ処理など、極めて限定的な機能に留める。
- 品質重視: 技術デモではなく、完成度が高く遊び甲斐のある polished なゲームを目指す。
- AI 禁止: AI 由来の素材は使用しない。
注意: ここに表示されているすべてのコンテンツは WIP(開発途中)であり、内容が大きく変更される可能性があります。
パレットレンダリング
VGA グラフィックスの特性と応用
VGA モード 13h は、PC ゲーム黄金時代を定義した
320x200 の 256 色グラフィックでした。線形フレームバッファ上に単一のバイトでパレットインデックスを表し、シェイダーなどの複雑な要素は不要というシンプルさが最大の魅力でした。
- 1 ピクセル = 1 バイト: この制約こそが、Doom や Duke Nukem に見られるような「シャープさ」と「明確さ」を生み出しました。
- 320x240 の採用: 私は VGA モード X(
)を目指し、非正方形ピクセル化を避けるためです。320x240
パレットの設計
使用されたパレットは 768 バイトで、以下の用途に割り当てられました:
- 透明用: 鮮やかなピンク(1 色)。
- 基本色: 純白・純黒(各 1 色)。
- 演出色:
- 大量の血表現のため、赤色系を重視。
- テクスチャ作成のための RGB キーやカラーコードドアに合わせた緑・青・レッドグラデーション。
- ゲーム舞台「Catlantis(古エジプト風)」に相応しい黄色・茶色(砂漠)。
- サイバーネティックな敵に対応するためのグレー系と、暗部を暖色系で表現するベージュ。
このパレットは試行錯誤を経て決定されたものであり、意図的な色選択が重要です。
カラーマップによるライティング手法
パレットレンダラーでは「距離に基づく減衰(フォグラディエント)」を実現するために、事前計算されたカラーマップを使用しています。シェイダーでの浮動小数点計算ではなく、パレットインデックスそのもので表現します。
- シャード化: パレットをシャード(色階)ごとに並べ、各色に対して暗いトーン(シャード)を用意。
- Oklab 距離判定: ユークリッド距離ではなく、人間の知覚に近い
色彩空間での距離を使って「最も近い色」を検出。これにより寒すぎるグレー避免出现させ、適度な暖かさを維持。Olab - オ(1) 時間計算:
- 壁・床・スプライトごとにカラーマップ行インデックスを 1 回のみ計算。
- リスト隠蔽(クイックカリング)を組み合わせて、高速にレンダリング可能。
// シャードインデックス(0)は元の色です。 float darkening_factor = (32 - shade_index) / 32.0f; target_darker_color.r = current_color.r * darkening_factor; target_darker_color.g = current_color.g * darkening_factor; target_darker_color.b = current_color.b * darkening_factor;
アセットの作成
Catlantean 3D のアセットは主に 3 つのカテゴリに分かれています:
- プリレンダー: Blender で 3D モデルをレンダリング。
- 手書き: Affinity Photo / Aseprite で意図的に作画。
- 手続き生成: Python スクリプトでパラメータを変えて自動生成。
プリレンダーされたスプライト
複雑なアニメーション(敵の歩行・射撃など)は、Blender でモデルを制作・リギングし、Python スクリプトで一括レンダリングしています。
- ** workflow**: Blender の Python API を活用して、8 方向 x アニメーション数フレームを自動生成。
- 高解像度からの処理: リサイズフィルタによるぼやけを防ぐため、Blender コンポジット機能でコントラスト・明瞭度を調整し、最後に Python スクリプトでパレット量子化(Olab 距離に基づく色付け)を行う。
- 効率性: 生成されたスプライトは
に含まれず、必要に応じて再コンパイル可能です(RTX 3070 で約 15 モデルを処理するのに約 10 秒)。.gitignore
手書きスプライトとテクスチャ
Blender の自動レンダリングでは表現しきれない「魂」や「雰囲気」は、すべて手作業で描くことで実現しています。
- HUD と UI: ステータスバー、遷移画面、フォントなどは完全手描き。Affinity Photo を用いて 3D リリーフ・ノイズ・発光などを層ごとに構築し、Aseprite でピクセルパーフェクトな境界を加工。
- スケールの統一: ゲーム世界の
を基準にスプライトを作成し、不自然な解像度混合を防止。1 ユニット = 64 ピクセル - 拾得物のリファイン: 既存の素材も手動でコントラスト調整や色補正を行い、よりクリアに見せる。
手続き的に生成されたテクスチャとギブ(Gibs)
繰り返し発生するパターン(廃材・汚れ・摩耗など)は、手書きが退屈かつ非効率であるため、Python スクリプトで生成しています。
テクスチャ生成パイプライン
入力パラメータを調整するだけで、無限に異なるテクスチャが作成されます:
- 高計マップ: ノーマルマップとして使用(ライティング・影のベイク済み)。
- ノイズマップ: 変動表現。
- グリディマップ: 汚れと摩耗表現。
- 基本色・ブライッテマップ: 基調となる 2 色とその明るさ調整用。
ギブ(Gibs)生成アルゴリズム
敵へのダメージ(爆発・散弾等)で出現する血まみれの断片は、以下のステップでシミュレーションされます:
- Voronoi 分解: スプライトの各領域にランダムな重心を設定し、飛び散る個体を定義。
- Wound Bleeding(傷からの流血): チャンク境界から内側へ BFS 検索を行い、傷口の深さを計算。深さに応じて「血の色」または「元の色」をブレンド。
- Physics(物理演算): 重心・拡散・重力・ドラッグなどをパラメータ化し、簡易な衝突判定なしで飛散動作をシミュレーション。
{ "seed": 295312884, "frames": 20, "chunks": 48, "explode": 3, "gravity": 1.4, "drag": 0.22, "spread": 1.15, "spin": 9, "woundDepth": 2 }
プリレンダーされたパーティクルシステム
粒子エフェクト(光線・リングなど)も同様にシミュレーションして事前生成しています:
- 構成要素: コア、スパイク、衝撃波のリング、ノイズ。
- エネルギー合成: 累積エネルギーをパレットインデックス算術で直接マッピングし、ホワイトアウト効果を実現。
- モード別: ワンショット(爆発)とループ(持続光線)対応。
マップ編集
マップ編集ツールとしては Tiled を採用しましたが、レベルライトペイントやセルプロパティの機能が不足していたため、自作エディタを開発しました。
- 独自エディタの特徴:
- レベルライトペイント・セルフラグ・全エンティティプロパティに対応。
- プラットフォーム抽象化レイヤ(ファイル IO, 固定小数点クラス)を pybind で利用し、C++ エンジンと完全互換。
- wxPython の採用: tkinter よりもウィジェット操作感が良く、ネイティブな見た目を実現。UI ロジックとマップデータを書き離して保守性が高い設計。
- Plug & Play: 開発者がプレイヤーと同じエディタを使用可能であり、ツールバーアイコンも含めてそのまま配布します。
# pybind を通じた C++ エンジン内部への Python バインド例 # ゲームデータアーカイブの読み込みや固定小数点クラスの利用など from pybast import load_archive, fixed_point_entity archive = load_archive("game.dat") entity = fixed_point_entity(...)
結論
Catlantean 3D は、2027 年第 1 四半期頃の公開を予定しています。現在はレベル設計と新規アセットの追加開発中です。
- 価格: $5 - $8(廉価帯)。
- ソースコード: GitHub でオープンソース公開予定。
- コンテンツポリシー: ゲーム購入者はグラフィック・サウンドなどのデータアーカイブを取得可能。主人公には正当な報酬を、制作者にも同様に。
インディーゲーム開発において透明性の高いプロセスは、限られたリソースで信頼を築く重要な要素です。小さいコミュニティでも、真摯に取り組んでいるプロジェクトに応援したいという思いがあります。
「誰かが本当に何を作りながら心配しているのか」を理解し合うことは、最も正直な交流ではないでしょうか。
あなたの創作活動も、ぜひ見せ方を続けてください! この記事に共感した場合は、ソーシャルメディアでフォローしてください。