JAVAC.JP
HOSHI TETSUYA 星鉄矢
2005/07/26
hossy@javac.jp
http://www.javac.jp
Google
WWW を検索 WWW.JAVAC.JP を検索

1-2 3D計算の基礎

3D(3次元空間)なのでデータは(x,y,z)の形で保持する必要があります。
2D(2次元、平面)の際は、『MovieClipに(x,y)データを保持させる』という手段がありましたが、Flashで3Dを行う際に、この『MovieClipに保持させる』姿勢は正しくありません。
第一に、MovieClipの座標(_x,_y)を用いてそのアイテムのデータ(x,y)にするという思考は、(_x,_y)が(x,y,z)に対応しないために破局します。
では、MovieClipのプロパティとして、mc.x, mc.y, mc.zとして(x,y,z)を保持させる手ですが、一見可能なように思えますが、エッジ(line)の処理はどうすればよいのでしょう。特にMovieClip.lineToメソッドを用いて描画する際です。MovieClipを削除してしまえば、プロパティも一緒に消えてしまうので、lineToにより描いた線は消せません。変形に変形を重ねてエッジを表現することとなります。不可能ではないですが、後に述べる、『エッジは全て1つのMovieClipに描く』という作業を行う際には、これは決定的な障壁となります。
データをMovieClipのプロパティに保持させるという姿勢はやめた方がよいと思います。
これはMVCモデルを導入する際の必然の条件です。

Arrayを3つ、x,y,zに対応させてDataStorageを作る方法もありますが、{x:x,y:y,z:z}の形のクラス(またはObjectオブジェクト)を作りそれらをコレクションする方法が適切かと思います。

(x,y,z)座標系の3次元空間を回転させるには、回転の中心点が(0,0,0)の場合、回転角度をθとして以下のような演算を行います。回転の中心点が原点からずれている場合は、(x,y,z)から中心点の座標(x0,y0,z0)を引いて演算を行ったあと、再び(x0,y0,z0)を足すようにします。
簡便な手法として、全座標を取得した後、全体をセンタリング処理しておくことが挙げられます。

x軸回りの回転
 x = x* 1  + y* 0  + z* 0 
 y = x* 0  + y* cosθ  + z* sinθ 
 z = x* 0  - y* sinθ  + z* cosθ 
   
y軸回りの回転
 x = x* cosθ  + y* 0  - z* sinθ 
 y = x* 0  + y* 1  + z* 0 
 z = x* sinθ  + y* 0  + z* cosθ 
   
z軸回りの回転
 x = 
x* cosθ  + y* sinθ  + z* 0 
 y = x* sinθ  + y* cosθ  + z* 0 
 z = 
x* 0  + y* 0  + z* 1 

(x,y,z)座標系の3次元データを実際に描画する際には、視点のベクトルが(0,0,-1)を向いているときは、以下のような図を考えて計算できます。


条件として、当然ながら対象物のz座標が視点座標のz座標より小さくならないように、視点の位置を調整する必要があります。また、倍率とlenを適宜調整することで、適切なサイズに描画することができます。
また、視点位置を変更することで希望部分の描画を行うことができます。ただこの際、『視点と3Dの回転中心点は異なる』ことに留意しないと、操作性に違和感を産み出すこととなります。



BACKTOPNEXT




All Contents Copyright (C) 2005 HOSHI Tetsuya
Home