ゲームとかするよ

ゲーム制作・ゲームを遊んだ事に関する記事を書きます。

3D-2D変換

1. はじめに

この記事では,3D座標を2D座標に変換し,3D空間上の物体を2D画面上に描画する事を目的とする.

2. 2次元座標(スクリーン)とスクリーン前方の3次元座標との位置関係

まず,3次元座標を2次元座標に変換するために,表示する2次元座標であるスクリーンとスクリーン前方の3次元座標との位置関係について考える. 図1に,スクリーンと3次元座標の位置関係を示したz-y座標を示す.

図1 透視投影の図示(「AS3.0で3Dプログラミングを1から勉強する(3)-透視投影」(1))より

図1にある焦点とはプレイヤーの目の事であり,ここから3次元空間を眺めた時にうつる視界を,スクリーンとして2次元画面上に描画する. この図にあるように,3次元空間上の点P_1(z,y)は,スクリーン上の点(z_s,y_s)に映る. したがって,これらの位置関係から以下の比の関係が導かれる.ここで,焦点の座標は点(z_f,0)である.

y_s:y=(z_s-z_f):(z-z_f)

y_s=y\cdot\frac{z_s-z_f}{z-z_f}\tag{1}

また,z-x座標についても同様に考えると,

x_s:x=(z_s-z_f):(z-z_f)

x_s=x\cdot\frac{z_s-z_f}{z-z_f}\tag{2}

ここで,プレイヤーの視点である焦点の座標をz-y座標とz-x座標の原点(0,0)であると考えると,

z_f=0

であるから,(1)式と(2)式は,

y_s=y\cdot\frac{z_s}{z}\tag{3}

x_s=x\cdot\frac{z_s}{z}\tag{4}

となる.

また,計算を簡易にするために,焦点からスクリーンまでの距離z_s=1.0とする(すなわち,自分の視点から1.0だけ 前のx-y座標が画面上に映し出される.)と,(3)式と(4)式は,

y_s=\frac{y}{z}\tag{5}

x_s=\frac{x}{z}\tag{6}

と表される.

図2に,この時の位置関係を示す.

図2 焦点を原点とし,z_s=1とした時の透視投影の図示

以上により,スクリーン上の座標と3次元座標との位置関係が示された.

3. スクリーン上の座標と描画する画面の座標との位置関係

これまでに,スクリーン上の座標と3次元座標との位置関係を示した. 次に,スクリーン上の座標を実際に描画する画面上に映す事を考える.

描画する画面の横幅をwidth,縦幅をheightとする.

また,実際に描画する画面上のx軸,y軸上の任意の座標をx'y'とし, 今まで考えて来たスクリーン上の座標は同様にx_sy_sと表すとする.

そして,焦点のx軸に関する視野角を\phi_0y軸に関する視野角を\theta_0とすると, 原点(0,0)を実際に描画する画面の中心として, 実際に描画する画面上の横幅の半分\frac{width}{2},縦幅の半分\frac{height}{2}に対応するスクリーン上の座標は,

\tan\theta_0\tan\phi_0と表される.

したがって,

y':\frac{height}{2}=y_s:tan\theta_0\tag{7}

x':\frac{width}{2}=x_s:tan\phi_0\tag{8}

が成り立つ.

(7)式と(8)式をそれぞれx'y'について解くと,

画面上に描画する座標 y'=\frac{y_s\cdot height}{2\cdot tan\theta_0}
x'=\frac{x_s\cdot width}{2\cdot tan\phi_0}

となる.

4. 回転時の座標

次に,プレイヤーが回転した時に,スクリーンに映し出される画面について考える. プレイヤーがY軸を中心に-\phi\circ回るということは, 動かないプレイヤーのY軸を中心に周囲の物体が\phi\circ回っていると考える事が出来る. 実際に周囲の物体の座標を移動するのではなく,物体を描画する上でそのように考える. 回転行列を用いて(2)計算を行うと

Y軸を\phi\circ回転後のx座標をX,z座標をZとすると,

Y軸周りの回転 X=x\cos\phi-z\sin\phi
Z=x\sin\phi+z\cos\phi

X軸を\theta\circ回転する場合は,

X軸周りの回転 Y=y\cos\theta-z\sin\theta
Z=y\sin\theta+z\cos\theta

5. まとめ

3次元空間にある座標を2次元平面に描画する流れをまとめると,

  • 回転時の3次元座標を計算(項目4)
  • 3次元座標をスクリーン上に見える座標に変換(項目2)
  • スクリーン上の座標を,実際に描画する画面内の座標に変換(項目3)

となる.

参考文献:

1.AS3.0 で 3D プログラミングを1から勉強する (3) - 透視投影 - てっく煮ブログ

2.回転行列