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プロパティを併用して、「○秒で△回任意のメソッドを呼ぶ」ような時に使うメソッドっぽいですね。