キー操作でカメラを動かすサンプル
キーイベントを拾ってカメラを動かすサンプルを書いてみました。
- ←→キーで旋回、
- ↑↓キーで前後に移動します。
- 動きがわかるように空間には点をちりばめています。(ParticleFieldを利用)
はまりポイントは以下かな。意外とさくっと動きましたよ。
- カメラの種別をCameraType.FREEにしないと自由に移動できない。
- デフォルトではCameraType.TARGETになっていて、
- 常にターゲット(デフォルトでは[0,0,0])の方向を向く。
- 移動はできるが旋回等はできまない。(という認識でよいかな?)
- BasicViewが生成するカメラの種別はコンストラクタ引数で変更できるので、明示的にFREEに指定しています。
- デフォルトではCameraType.TARGETになっていて、
ソース
サンプルのソースは以下です。
package { import flash.ui.Keyboard; import flash.events.*; import org.papervision3d.materials.*; import org.papervision3d.materials.special.*; import org.papervision3d.objects.special.*; import org.papervision3d.view.BasicView; /** * カメラを動かしてみるサンプル。 * キーイベントを拾ってカメラを前後に移動、左右に旋回する。 */ public class Sample extends BasicView { /** * コンストラクタ */ public function Sample() { // カメラの種別を"FREE"にするために明示的に呼び出す。 // FREEにしないと、自由に移動できない。 super(500, 500, true, true, CameraType.FREE); // particleField を生成。 // 空間をランダムなドットで満たす。 var particleField:ParticleField = new ParticleField( new ParticleMaterial( 0x333333, 1), 400, 4, 2000, 2000, 2000 ); scene.addChild(particleField); // カメラの位置を初期化 this.camera.x = 0; this.camera.y = 0; this.camera.z = 0; // イベントリスナを設定。 var self:Sample = this; this.stage.addEventListener(KeyboardEvent.KEY_DOWN, function(ev:KeyboardEvent):void { // キーが押されたら.onKeyDownを実行。 self.onKeyDown(ev); }); // レンダリング開始 startRendering(); } /** * キーイベントを処理する。 */ private function onKeyDown(event:KeyboardEvent):void{ switch (event.keyCode) { // →キー、←キーでカメラを右左に旋回 case Keyboard.RIGHT: this.camera.yaw(2); break; case Keyboard.LEFT: this.camera.yaw(-2); break; // ↑キーで前に、↓で後ろに移動。 case Keyboard.UP: this.camera.moveForward(10); break; case Keyboard.DOWN: this.camera.moveForward(-10); break; } } } }
ところで、asだと
var self:Sample = this;
みたいな事はしなくて良かった気がするのだけど、さてどうするんじゃったかいのー。