transformVectorsで透視投影して3D表示
forked from Utils3D.projectVectorsの練習 (diff: 14)
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();
});
}
}
}