2008-02-01
PV3D 2.0 のソースを読む
PV3D まともにソース読んだこと無かった。どんな仕組みなんだろーナー。読んだメモ。
DisplayObject3D
カメラのソース見たらスパースパースパークラス当たりでDO3D が。その上が D03DContainer。たぶん空間の情報持つやつは全部 DO3D の子クラス。
コアっぽいクラス Number3D/Matrix3D
PV3D ではxyz情報を持つクラスが Number3D で 4x3 行列を持つクラスが Matrix3D。4x4 行列じゃないのはたぶん計算量減らすため(4列目はつねに (0,0,0,1) で計算)。
matrix な プロパティ
DO3D では
- transform
- view
- world
に Matrix3D をプロパティとして持つ。基本的に
project
実際にここで camera の matrix を使い、 world 座標から screen 座標を求めるメインの処理。重い処理なので出来るだけキャッシュが使われるようになっているっぽい。
screenZ という z ソートに使われる座標は子ノードの平均値かー。結構適当やね。
updateTransform
transformDirty プロパティにより必要がある場所で実行。似たようなのに rotationDirty もある。
ワールド座標
sceneX/sceneX/sceneZ
3D空間上の実際の座標。具体的には transformの4行目の xyz
screen 座標
screen プロパティの Number3D オブジェクト。実際に表示される場所の位置。
座標移動
DO3D では FORWORD(+z) BACKWARD(-z) LEFT(-x) RIGHT(+x) UP(+y) DOWN(-y) な正規化されたベクトル(というかNumber3D)を持つ。これを現在の回転方向に適用して移動させるためのメソッドがある。moveForword/moveBackword/moveLeft...。また translate() で特定方向に正規化させたベクトルを渡すことで平行移動できる。
DO3D を読んで
DO3D は無難なつくりだなー。描画系が無くてzがついたDisplayObjectContainer みたいな。これぐらい知れれば適当に描画できるので Camera3D と DisplayObject3D のみでレンダリングを実装してみる。
途中 DisplayObjectContainer3D#numChildren の値が removeChild したとききちんとデクリメントされないバグ見つけてはまった…。
んーただの行列変換だけなら自分で書いた方が楽だし速いしサイズ小さいしいいなー。フルスタックなの欲しいときは PV3D なんだろうけど。
いろんなサイトを久しぶりに見た
ら、やっぱり手をつけてみたいことがたくさん出てきてしまってダメだ…。(どれか一つに集中しないとろくなアウトプットが出せない)
今日のエクボさん
ゴールドメンバーシップが切れた!!!