本稿が想定する「作る物」は「疑似3D主観表示なタイプのDRPG」である.
この表示(描画)に関する.
ガチで「3Dグラフィクス」を考えるならそっち系のライブラリ(OpenGLだとか)を使うことを考えるべきだが,本件はグラフィックに関して(も)「ガチじゃない」ので, ここでの目標は「圧倒的に簡素なグラフィックの表示」である.
迷路なる閉鎖空間で視界に存在する対象とは何か? というと,まぁ基本的に{床,壁,天井}である.
ここで{床,天井}のことは忘れる.さくっとあきらめる.
結果,「壁さえ描画すればおk」ということになる.OK.
ところで,本件で作る物には以下のような前提がある.
また,「光源」に関しては話を簡単にするために真面目に扱わないことにする.
「カメラに近いほど明るくて遠いほど暗い」程度の話で十分であろう.
つまり,【「任意の照明条件下で」「任意の3Dオブジェクト群を」「任意のカメラ位置姿勢で見た」状態】というのを相手にするわけではないということだ.
っていう限定的な世界ならば,普通の3次元グラフィクスで行われるような計算をする必要はほとんど無い.
描かれる絵とは常にこんな物↓でしかない.
壁の色として赤を選んでしまう壊滅的な色彩センスについては置いとくとして,とにかく極限まで話を簡単にした結果,壁は「縦線の集合」として描けるということになった.
すなわち,絵の各x座標に関して
っていうのを決める計算をすればよいだけだ.x方向に関する1次元のループを書けばおしまい.
上端から下端までの範囲を何区間かに分割して区間ごとに色を変えてやれば模様も描ける:テクスチャマッピングだ.
「これはドアです.そう見えますよね?」っていう簡素な「模様」くらいならば,そんなのをハードコーディングすればいける.
……っていうような話は,なにやら世間では「レイキャステイング」とか呼ばれているっぽいね.
単に「レイキャスティング」っていうと「レイを飛ばしてどうの…」という話全般を指す言葉になると思うんだけど,
上記のような【{データが実質2Dで,カメラ回転もYawだけで…}みたいな条件下なら1次元(x方向)の走査だけでいいよね】的な話を特に指す言葉として用いられていることがあるように見える.
「レイキャスティングで階段みたいな段差を描画するにはどうすればいいですか?」みたいな感じで.
とりあえず上記のような話で壁(迷路)を描くことはできるけど,やっぱり「壁オンリー」だと寂しい.
「寂しい」というか,プレイしていて「あそこに何かあるぞ」ってのがわからないと
ゲームとしてつらい .
何かある場所には「なんかあるよ」っていうのを示すための表示くらいはしたい.
しかしガチに3Dなオブジェクトを描画するのはもちろん避けたい.
「それをやるならもう OpenGL
とか……」的な話を避けるというのが大前提なのだ.簡単に済ませたい.2次元グラフィクスで済ませたい.
OK,壁を線で描いたならオブジェクトも線で描こうぜ.ワイヤーフレームだ.
(もちろん「陰線消去」だとかいう難易度高い話は知らなかったことにしよう.ついでに「カリング」なんて言葉も知らないです.)
「線さえ描ければやれる」という点では壁の描画と同じだが,以下の2点が違う:
とはいえ,さほど問題は無い.
というのは,壁の描画を終えた時点で画像の各x座標に関する「奥行き」が求めらているからだ(壁の描画色の明暗を決めるのに使っている).
ワイヤーフレームの線を描く際には,この奥行情報(1次元の「デプスバッファ」)を参照してやれば「見えている範囲/隠されている範囲」がわかる.
(最も単純には,ブレゼンハムのアルゴリズムで1pixelずつ調べればよい.)
あと,多分「端っこだけがちょっと見えているかも」みたいなオブジェクトは描かなくても特に問題はなかったりするだろうから
どのオブジェクトを描画すべきか? っていう最初らへんの時点でわりとてきとーに枝狩りしちゃって良いと思う.
……というわけで,階層間を移動する場所くらいは極限まで簡素なグラフィックで示すことができるだろう.
はい,これが下の階に行くための梯子のつもりです.
(梯子が穴のど真ん中にまっすぐ立ってるというのは,すごく物理的に間違っている感があるけど)