3D回転

英語版購入後、まさかの日本語翻訳版が発売され嬉しいやら悲しいやらのMaking Things Moveですが、9割方読了しました。「もっと早くからこの本を読んでおくべきだった」と思うくらいの充実の内容です。書評は改めてエントリーしようと思いますが、とりあえず今日は本書で紹介されている3D回転のカスタマイズについてです。

15章で紹介されている、Y軸を中心にオブジェクトが回転し続けるサンプル(RotateY.as)を、任意の角度だけ回転して止まる様に改良しようと、出来の悪い頭を随分と悩ませてみました。その際、以前エントリーしたTweenerでprivateプロパティをイージング操作する方法が役に立ったので、情報共有をば。

[こんな感じでトゥイーンで回転]
http://www.studio-hedgehog.com/prototype/as3/3dRotation/

本書掲載のコードはご紹介できないので、以下主な改良点だけざっくりと書きます。この本を持っていない方は、なんのことやらさっぱり分からないと思います。ごめんなさい。

1. Ball3Dクラスに新たに、initX, initY, initZというインスタンスプロパティを用意。これらの値にはメインクラスのinit()実行時にxpos, ypos, zposの値を代入する。(サンプルに従い、ここではpublicメンバにしてあります)

public var initX:Number;
public var initY:Number;
public var initZ:Number;

2. メインクラスにy軸回転用のプロパティを用意。

private var _angleY:Number = 0;

3. Event.EnterFrameリスナーを登録する代わりに、Tweenerを使用します。

Tweener.addTween (this, {
  //y軸を中心に時計回りに360度回転
  angleY:Math.PI * -2, 
  time:3, 
  transition:"easeInOutBack"
});

4. getterとsetterを用意。

public function set angleY(angleY:Number):void {
  _angleY = angleY;
  for each (var ball:Ball3D in balls) {
    rotateY(ball, angleY);
    doPerspective(ball);
  }
  sortZ();
}

public function get angleY():Number {
  return _angleY;
}

4. メソッドrotateY()の3,4行目を以下のように変更

var x1:Number = ball.initX * cosY - ball.initZ * sinY;
var z1:Number = ball.initZ * cosY + ball.initX * sinY;


angleYをpublicにして、TweenerのonUpdateで回転させるメソッドを呼んでやるよりは、こちらの方がスマートだと思います。Tweener.addCaller()でも同様のことができるのかと思ったのですが、どうもこのメソッドはtimeとcountプロパティを併用して、「○秒で△回任意のメソッドを呼ぶ」ような時に使うメソッドっぽいですね。