今日まで私が作っていたゲームは、描画対象ごとに角度計算をして3D座標を2D座標に変換していました。しかし、かなり計算量が多いため描画対象への制約が厳しくなっていました。また、描画対象ごとに計算が微妙に異なることから画面端が魚眼レンズのように歪む現象が生じていました。
そこで思いついたのが表題の方法です。この方法では①角度計算が1回だけで済むため計算量が大幅に減少する上、②全ての描画対象に同じ計算ルールが適用されるため画面端が歪まない、という大きな利点があります。
手順としては以下のとおりです。
3D空間上の点(X1000,Y0,Z0)、(0,1000,0)、(0,0,1000)と視点のあるXYZ、視点の方位角θと仰角φを使い、各点が2D上で描画される座標XYを把握する(1000にしているのはウディタで小数点を使えないことへの対策)。
(2022年2月21日:プラス側とマイナス側を考慮する必要があるので、
(-1000,0,0)、(0,-1000,0)、(0,0,-1000))も考えてやる必要がありそうです。)
上記の座標XYは、3D空間上でXに1000動かした時の2D上のXとYの動きを表す関係式となる。具体的には、各点の座標をX:2DX,X2DYのように表したとすると、(X●●,Y◆◆,Z▲▲)という点があった場合、その点の2D上のXY座標は以下のようになる。
2D上のX座標=(●●×X:2DX+◆◆×Y:2DX+▲▲×Z:2DX)/1000
2D上のY座標=(●●×X:2DY+◆◆×Y:2DY+▲▲×Z:2DY)/1000
あとはこれまで同様、2D上の各座標を使って四角形を自由変形して描画します。
ウディフェスに出す予定のゲームに実装してみてどう動くかやってみたいと思います。
2022/03/08 追記:これは平行投影という、奥行きの出ないやり方でした。反省。
Comments