2007-06-23
■ AS3でプラネタリウムソフト(其の二)

前回作ったプラネタリウムソフトの続きなのだけど、画面表示部分をPapervision3D化してみた。
天文計算は前と同じで、画面表示だけをPV3Dに任せる作戦で。大きめの天球儀を3Dで作って、天球儀の内側にカメラを置けば、現実の星空を観測するのと似た感じで表示できるというもくろみなのだ。
PV3Dのクラスで欲しい機能に一番近いのは org.papervision3d.objects.Stars なのだけど、Starsは単にランダムな点を打つだけなのでこのままでは使えない。でもやりたいことは似ているので、PV3DのStars.asを参考にしつつ、天球儀を内側から見た図、というVertices3D派生クラスを作ってみた。
Vertices3D派生クラスを自分で作って、3D→2D計算はPV3Dにやらせて、2Dの描画は自分やることにする。Vertics3D派生クラスのコンストラクタで geometry.vertices に Vertex3D を突っ込んでおけば、 public override function render(scene:SceneObject3D)で、キーがVertex3Dで値がVertex2Dのマップなprojectedを見ながらBitmapDataでもGraphicsでも好きなところに描画すればよい。Vertex3Dのextraには利用者が何でもぶら下げておけるみたいなので、今回はここに恒星データをぶら下げておくことにする。
スプライトの重ね合わせは、ルートクラスにBitmapとSpriteを重ねて貼り付けて、Bitmapに星を、Spriteに星名ラベルと方位ラベルを表示することにした。
インタラクションはマウスだけ。
- マウスを画面中央から上下にポイントすると仰角を上下する。0度〜90度の範囲
- マウスを画面中央から左右にポイントすると方位角を左右に振る。360度ぐるっと回る。
- クリックすると視野の移動を一時停止/解除する
- ホイールでズームイン/ズームアウトする
観測地点は東京タワー付近にしてみた。観測時刻は1秒ごとに現在時刻で再計算する。
図1 南西の方向
図2 北極星付近
北斗七星が良く見える。その脇に輝く小さな星までも(見えません)。
図3 地平線より下にある星も見える
これは見えなくするか、うすく見えるようにするか、どうにかしたい。
機能は前と違わないのだけど、表示系が3Dになっただけでずいぶんリッチになった。現実の星空をぐるっと見回すような感じで、けっこう良いのではないかと思った。
今回は星の位置計算を自前の回転行列でやったけど、これもPV3Dに任せればもっと高速にできるんじゃないかと思う。
デモ
ソースも公開した。








