2008-01-10 | 20:24
(3Dライブラリ等を使用せず)transform.matrixの操作だけで画像を3D回転させています。
(マウス位置によって回転軸は変わります。回転していない場合はマウスを絵の上に持っていってください。)
「線形代数を勉強したいが、固い教科書は嫌だ」という人におすすめ。
(マウス位置によって回転軸は変わります。回転していない場合はマウスを絵の上に持っていってください。)
やっていることは単純で、回転後の基底ベクトルを求めて、(固有値が1になるように補正した後)transform.matrixに設定しているだけです。
package { import flash.display.*; import flash.events.*; import flash.geom.*; [SWF(width='300',height='300',backgroundColor='0xffffff',framerate='5')] public class RotationMatrix extends Sprite { [Embed(source="lena.jpg")] private var myImage:Class; private var bm:Bitmap = new myImage(); private var rad:Number = 0; public function RotationMatrix( ) { addChild(bm); bm.x = bm.y = 100; addEventListener(Event.ENTER_FRAME, onEnterFrame); } public function onEnterFrame(event:Event):void { if( stage.mouseX < 0 || stage.mouseX > 300 || stage.mouseY < 0 || stage.mouseY > 300) return; // マウス位置を元に回転軸のベクトルを決める var vx:Number = stage.mouseX - 100; var vy:Number = stage.mouseY - 100; var len:Number = Math.sqrt(vx*vx + vy*vy); vx /= len; vy /= len; rad += 0.1; // 回転後の基底を求めて変形行列に設定 var m:Matrix = bm.transform.matrix; m.a = (1-Math.cos(rad))*vx*vx + Math.cos(rad); m.b= (1-Math.cos(rad))*vx*vy ; m.c = (1-Math.cos(rad))*vx*vy; m.d = (1-Math.cos(rad))*vy*vy + Math.cos(rad); // 変形行列の固有値を1にするため(大きさを変えないため)の係数 var s:Number = vx / (m.a*vx + m.b*vy); m.a *= s; m.b *= s; m.c *= s; m.d *= s; bm.transform.matrix = m; } } }
「線形代数を勉強したいが、固い教科書は嫌だ」という人におすすめ。
スポンサーサイト
Comment
Post a comment