読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

キー操作でカメラを動かすサンプル

キーイベントを拾ってカメラを動かすサンプルを書いてみました。

→キーイベントを拾ってカメラを動かすサンプル

  • ←→キーで旋回、
  • ↑↓キーで前後に移動します。
  • 動きがわかるように空間には点をちりばめています。(ParticleFieldを利用)

はまりポイントは以下かな。意外とさくっと動きましたよ。

  • カメラの種別をCameraType.FREEにしないと自由に移動できない。
    • デフォルトではCameraType.TARGETになっていて、
      • 常にターゲット(デフォルトでは[0,0,0])の方向を向く。
      • 移動はできるが旋回等はできまない。(という認識でよいかな?)
    • BasicViewが生成するカメラの種別はコンストラクタ引数で変更できるので、明示的にFREEに指定しています。

ソース

サンプルのソースは以下です。

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;

みたいな事はしなくて良かった気がするのだけど、さてどうするんじゃったかいのー。