2010-04-19 | 16:31
長い間ActionScriptを触ってないうちに3次元マトリックスを扱えるようになっていたらしい。
(150,0,0)にある垂直軸を中心に回転しているように見せるために、
1. (0,0,Z)に移動(Zは回転半径)
2. Y軸中心に回転
3. (150,Y,0)に移動
という行列を順番に適用している。
(この例ではスプライトが重ならないようにしてあるが、重なる場合はZオーダーを考慮しないと視覚的に不自然になる)
(150,0,0)にある垂直軸を中心に回転しているように見せるために、
1. (0,0,Z)に移動(Zは回転半径)
2. Y軸中心に回転
3. (150,Y,0)に移動
という行列を順番に適用している。
(この例ではスプライトが重ならないようにしてあるが、重なる場合はZオーダーを考慮しないと視覚的に不自然になる)
package { import flash.display.*; import flash.events.*; import flash.geom.*; [SWF(width='400',height='400',backgroundColor='0xffffff',framerate='5')] public class Rotate3D extends Sprite { [Embed(source="lena.jpg")] private var myImage:Class; private var container:Sprite; private var container2:Sprite; private var bm:Bitmap = new myImage(); private var bm2:Bitmap = new myImage(); private var m:Matrix3D = new Matrix3D(); public function Rotate3D( ) { container = new Sprite(); container.addChild(bm); container2 = new Sprite(); container2.addChild(bm2); addChild(container); addChild(container2); addEventListener(Event.ENTER_FRAME, onEnterFrame); } public function onEnterFrame(event:Event):void { m.prependRotation(3, Vector3D.Y_AXIS); var temp:Matrix3D = m.clone(); var temp2:Matrix3D = m.clone(); var pos11:Matrix3D = new Matrix3D(); pos11.position = new Vector3D(0, 0, 150); temp.prepend(pos11); var pos12:Matrix3D = new Matrix3D(); pos12.position = new Vector3D(150, 200, 0); temp.append(pos12); var pos21:Matrix3D = new Matrix3D(); pos21.position = new Vector3D(0, 0, 50); temp2.prepend(pos21); var pos22:Matrix3D = new Matrix3D(); pos22.position = new Vector3D(150, 50, 0); temp2.append(pos22); container.transform.matrix3D = temp; container2.transform.matrix3D = temp2; } } }
スポンサーサイト
Comment
Post a comment