« Think C | MAIN | [f5]フラットぐらい… »

[as]FP10をそろそろ。Matrix3Dとか

FlashPlayer10が公開されてしばらく、そろそろFP10向けの勉強を初めてみようかと思ってます。とりあえずはGraphics辺りから始めようと思いますが、公開されたらテストしてみようと思ってたMatrix辺りから。
環境はなんとなく Flex4 Gumbo の Nightly Builds で(flashパッケージしか使わないけど)。

>> Flex4 Gumbo Downloads
>> flashplayer10 reference( 070208 )
>> Gumbo Language Reference

最初に Matrix のパフォーマンスを見てみたのですが、ここは前と変わりがないようです。相変わらずちょと遅い。

で、Matrix3D の パフォーマンスを見たのですが、こちらは少し妙で。どうも遅い。テストは append, prepend系の行列計算を見たのですけど。テストデータが悪いのかもしれないと思える程、気持ち悪いぐらい遅い。遅いかと思ったら速いときもある…。微妙です。遅いときは自前で組んだものより50倍ぐらい遅い。謎です。遅くなる場合の条件がよくわからんのですが、気が向いたら調べるかもしれません。PV3D とか away3D の既存のライブラリは、そのまま自前の改良でいくんでしょうね。

とはいえ、Matrix3Dのメンバ関数を見ると、decompose()、recompose()、interpolate()、transformVectors()など、便利系、DisplayObjectとの整合性的なものが見られます。生っぽいMatrixのライブラリより利用するには便利なのかなぁという印象です。とりあえず簡単なサンプルをつくってみた。
※flashplayer10が必要です。

ソースはこちら。

package  
{
	import flash.events.Event;
	import flash.display.*;
	import flash.geom.*;
	
	[SWF(width=425, height=425, frameRate=60, backgroundColor=0x000000)]
	public class TestMatrix3D extends Sprite
	{
		private var particle_num:int = 3000;
		private var vertices_in:Vector.<Number>;
		private var vertices_out:Vector.<Number>;
		
		private var _matrix:Matrix3D;
		
		public function TestMatrix3D() 
		{
			//初期座標(x,y,z)と変換用のVectorつくる
			vertices_in  = new Vector.<Number>( particle_num*3, true );
			vertices_out = new Vector.<Number>( particle_num*3, true );
			
			//てきとうに座標いれとく
			for ( var i:int = 0; i < particle_num ; i+=3 )
			{
				vertices_in[i]   = Math.random() * 200 - 100;  // x
				vertices_in[i+1] = Math.random() * 200 - 100;  // y 
				vertices_in[i+2] = Math.random() * 200 - 100;  // z
			}
			
			//今回はこれのテスト
			_matrix = new Matrix3D();
			
			//中心にしとくとか
			x = stage.stageWidth/2;
			y = stage.stageHeight/2;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			
			addEventListener( Event.ENTER_FRAME, enterframe );
		}
		
		private function enterframe( e:Event ):void
		{
			//回転軸のベクトル
			//xは右、yは下、zは奥方向が正っぽい。
			var rotateAxis:Vector3D = new Vector3D( 0.2, 1.0, 0.1 );
			
			//行列に回転あてるよ。単位はラジアンでなくて度
			_matrix.appendRotation( 1, rotateAxis );
			
			//vertices_inの変換座標が、vertices_outに入るよ
			_matrix.transformVectors( vertices_in, vertices_out );
			
			//描画
			graphics.clear();
			for ( var i:int = 0; i < particle_num ; i++ )
			{
				var vx:Number = vertices_out[i]; i++;
				var vy:Number = vertices_out[i]; i++;
				var vz:Number = 400/(vertices_out[i] + 400);
				graphics.beginFill( 0xffff00 );
				graphics.drawRect( vx*vz, vy*vz, 1, 1 );
				graphics.endFill();
			}
		}
	}	
}

まぁぼちぼち。

COMMENT+

いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。

TRACKBACK

URL : http://nutsu.com/cgi/mt/mt-tb.cgi/97