クォータービュー表示ロジック(1)
クォータービューは、基本的には、あらゆるオブジェクトを、カメラからの距離に応じて、遠い順に上書き描画していけば、とりあえず表示として破綻する事なく描画する事ができる(もっと効率の良い方法があるかも知れないが、模索中)。
- (カメラ的)前後に当たり判定の大きいオブジェクトはどうにかして分割する必要があるが。
- 3D物も似たようなものかも?
今回は、このクォータービューでのオブジェクトの最適描画順を求めるアルゴリズムをどうにかして考えてみたい。
今回も、考えながら書くので結論は最後(というか、マトモな結論が出るのかは怪しげ)。
まず、前提条件として、以下のように決めておく。
- 表示ロジック的には、あらゆるオブジェクトは(x, y, z)の3D座標値を持つものとする。
- x, y, zはマイナス値も取り得るという事にする(つまり、相対座標値)。
- x, y, zは可能なら、非整数値(小数または分数値)も取り得るという事にする。
- (x, y, z) = (0, 0, 0)のポイントから見て、(1, 1, 0.5)はまっすぐ手前、(-1, -1, -0.5)はまっすぐ奥である、という事にする(正確には、カメラは(∞, ∞, ∞/2)に位置し、そこから(-∞, -∞, -∞/2)方向を見ている、という事になる……筈。多分)。
- (※具体的には、下記の図1を参照)
- カメラ位置を可変とするならば、クォータービューだけじゃなく、普通の3Dなfpsにも応用可能な気がする。今回は面倒なので固定のまま進めるが。
- 要するに、斜め45度上から、斜めに地図を見ている、というのを数学的に表現したらこうなるという事……の筈。
- 前項目により、奥行きに対する優先順位は分かるようになったが、同じ奥行きの場合での優先順位が不明なので、以下のように定義しておく。
- カメラ座標の真正面に一番近いものが一番手前、そこから離れるほど奥表示になるものとする。
- 具体的には、図1のGとEとCでは、Eが一番手前で、GとCはEよりもほんの少し奥の方になるように表示すれば良い、という事になる。
図1: 例えば、よくある(z座標を持たない)ゲーム的2D空間なら、以下のようになる。
要するに、A=(0, 0)で、C=(2, 0)、I=(2, 2)という座標系 +-------> x | A B C | D E F | G H I V y ……を、クォータービュー的表現にすると、 X / \ / A \ / D B \ / G E C \ L H F V y I x になる(実際はもっと横長になるが)。
と、今日はここまで考えたところで終了。
続きはまた今度考える。
次回への課題。
- 最も簡単に考えた場合、前述の条件より、カメラから、あるxyz座標値を持つオブジェクトへの(相対?)距離は演算によって求める事が可能なように思える。仮に、この演算を行う関数をd()と呼ぶ事にする。
- 要するに、つまり、全オブジェクトをd()でsortすれば、今回考えている描画順序問題は解決する。
- でも、それって、どのくらい実用的な負荷で可能なの?
- ソートアルゴリズムの選定は?
- また、このsortをどうにかして楽にするような方法は無いの?
- 多分、3D系の人ならノウハウを持ってそうな気がする。
- 全オブジェクトでsortする以外の方法は無いの?
おまけ: 今回の内容を考えながら疑問に思った事。
- 複素数を使えば楽に2D空間を表現できるが、3D空間は無理?
- 行列表現にするしか無い?だけどそれって効率いいの?
- 高校時代に数学をサボったツケが来たか……。とりあえず今回は諦める。
(追記: 図1の座標ラベル間違えてたり、細かい間違いがあったので、こっそり直した)