2Dと3Dと疑似3Dの考え方

あんまりまとまってないんだけど。
3Dのゲームは作ったことないんだけど。
とりあえず考えたことを残しておこう。


3Dの描画をあれこれ試していたらなんとなく、3D描画っつーのは、3Dのワールド座標系にオブジェクトを配置して、それをカメラを通して見た風景として描画するものなんじゃなかろうか、と思った。
それはすなわち、最終的に出力される画面はさておいて、座標系の中でオブジェクトを操作する、すなわち、数字の世界でゲームが回っているということだ。
2Dはどうなのかというと、特殊な場合を除いて座標は画面のピクセルで管理する。
最終的な画像と、アルゴリズムで使われる数字は対応する。
この違いがゲームの作り手側に与える影響は結構大きいはずだ。


DXRubyは2D専用として作っているが、3D対応を求める声がいくつかあるのは知っている。
俺が目にした意見の数から言うと割合は高い。
が、2Dと3Dでは考え方が大きく違うから、DXRubyにそのような機能を載せるよりも、それに適した仕組みを持ったライブラリを新たに構築するほうがよいと思う。
いまのところ、一般的な3Dゲーを作れるような機能を搭載する予定は無い。


話は変わるが、StarRubyにはSFCぽい疑似3D表現が簡単にできる透視座標変換機能がある。
でもそれを使って作られたゲームがいまのところ無い。と作者さんが言っていた。
俺もちょっとだけいじったことがあって、たしかに簡単に透視座標変換ができてすげーって思った。
が、これで何か作るのは難しいな、とも思った。
原因を考えてみた。
StarRubyの透視座標変換は地面を描画するほかに、キャラを正しい位置に描画する機能がある。
これらのキャラはワールド座標系に存在し、透視座標変換描画では画面を作るためのカメラの位置と角度を設定し、その風景を描画する。
これは3Dゲーの作り方だ。
StarRubyの透視座標変換は3D描画機能を使わずに、2D描画機能で簡易的に3D表現をするものなのだ。
2Dゲーの延長でマリオカートが作れる、と思うとハマる。


DXRubyの疑似3D対応は、前から「2Dの延長」と考えてきた。
具体的にどうすればそうなるのかはよくわからなかったが、なんとなくイメージが見えてきた。
ワールド座標系で世界を表現するのではなく、画面に対応した3D座標系を持つ感じだ。
640*480*640、みたいな。
パースがかかるから奥のほうに行けば描画範囲は広くなり、その程度は射影変換行列で指定できる。
俺がやりたかったのはもともと、2D表現に奥行きを持たせることであり、座標系は2D+1次元となるのだ。
2Dが紙の上に何かを描くものなら、DXRubyの疑似3Dは舞台の上に何かを配置する感じになる。
従って、カメラの位置は固定。
2Dで移動するのに画面のモノを逆方向に動かすのと同様に、疑似3Dで移動するなら画面内のオブジェクトを逆方向に動かしてもらう。
このような仕様は今まで見たことが無いし、いまどきのPCで実現するようなレベルのものではない。
でも俺は2Dゲームのテクニックの延長で3D表現ができるものを作りたかったのだ。


2Dゲームを作る人が、ちょっと3D表現したいといった場合に、3Dゲームの作り方で作り直すのは大変なことだ。
2Dと3Dの中間点を疑似3Dと呼ぶなら、このような形の疑似3Dがあってもいいんじゃなかろうか。
支持が得られるかどうかはまったくわからないが。