transformVectorsで透視投影して3D表示

by nitoyon forked from Utils3D.projectVectorsの練習 (diff: 14)
♥0 | Line 35 | Modified 2009-08-09 19:45:43 | MIT License
play

ActionScript3 source code

/**
 * Copyright nitoyon ( http://wonderfl.net/user/nitoyon )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/8NNz
 */

// forked from nitoyon's Utils3D.projectVectorsの練習
package{
import flash.display.*;
import flash.events.*;
import flash.geom.*;

[SWF(width=500,height=500,backgroundColor=0x000000, frameRate=12)]
public class TestTriangles extends Sprite{
	private const N:int = 100;
	private const R:int = 150;
	private const F:int = 300;

	public function TestTriangles(){
		// 100個の点を3D座標空間に作成する
		var points:Vector.<Number> = new Vector.<Number>();
		for(var i:int = 0; i < N; i++){
			points.push(Math.random() * R * 2 - R); // X座標
			points.push(Math.random() * R * 2 - R); // Y座標
			points.push(Math.random() * R * 2 - R); // Z座標
		}

		// 変換行列
		var mtx:Matrix3D = new Matrix3D();

		// 変換結果の座標
		var results:Vector.<Number> = new Vector.<Number>();

		// 毎フレーム処理
		addEventListener("enterFrame", function(event:Event):void{
			// 変換行列の角度を増やす
			mtx.appendRotation(5, Vector3D.Y_AXIS);
			mtx.appendRotation(3, Vector3D.X_AXIS);
			mtx.appendRotation(2, Vector3D.Z_AXIS);

			// 座標を回転させる
			mtx.transformVectors(points, results);
			//Utils3D.projectVectors(mtx, points, results, uvts);

			// 描画する
			graphics.clear();
			graphics.beginFill(0xffffff);
			for(var i:int = 0; i < N; i++){
				// 透視投影の倍率を計算
				var z:Number = results[i * 3 + 2];
				var f:Number = F / (-z + F);

				// 表示
				graphics.drawCircle(results[i * 3] * f + R + 80, results[i * 3 + 1] * f + R + 80, f * 1.5);
			}
			graphics.endFill();
		});
	}
}
}

Forked