3D基本事項(1点透視法)サンプル : ActionScript -3D-

Pocket

ActionScriptを使った3D表現(3D基本事項(1点透視法) : ActionScript -3D-)のサンプル。

// 1点透視法
function Elem(defaultX, defaultY)
{
	//--------------------------------------
	//  変数
	//--------------------------------------
	this._x = defaultX;
	// 初期はステージ外へ
	this._y = defaultY;
	// 3次元座標
	var x3D:Number;
	var y3D:Number;
	var z3D:Number;
	// 焦点
	var fl:Number;
	// 消失点
	var vpx:Number;
	var vpy:Number;
	//--------------------------------------
	//  関数
	//--------------------------------------
	// 初期化 : 3次元X, Y, Z, 焦点, 消失点X, Y
	this.initElem = function(argX3D, argY3D, argZ3D, argFl, argVpx, argVpy)
	{
		// x3D,y3Dはscale=1(スクリーン上の位置)
		x3D = argX3D;
		y3D = argY3D;
		z3D = argZ3D;
		// 焦点
		fl = argFl;
		// 消失点
		vpx = argVpx;
		vpy = argVpy;
		// フレームハンドラ
		this.onEnterFrame = moveHandler;
	};
	var moveHandler = function ()
	{
		var scale = fl / (fl + z3D);
		if (scale >= 1)
		{
			delete this.onEnterFrame;
		}
		// 3次元を2次元へ投影
		this._x = (x3D - vpx) * scale + vpx;
		this._y = (y3D - vpy) * scale + vpy;
		// 大きさ
		this._xscale = this._yscale = scale * 100;
		// z座標を変更
		z3D -= Math.random()*20+10;
	};
}
function Controller()
{
	// 焦点
	var fl:Number;
	// 消失点
	var vpx:Number;
	var vpy:Number;
	// 初期化
	this.initController = function(argFl, argVpx, argVpy)
	{
		fl = argFl;
		vpx = argVpx;
		vpy = argVpy;
		for (var i = 0; i < 30; i++)
		{
			// 3D座標
			var x = Math.ceil(Math.random() * Stage.width);
			var y = Math.ceil(Math.random() * Stage.height);
			var z = 1000;
			// 要素作成(ステージの外へ配置)
			var elemProp = new Elem(-100, 0);
			var elem = _root.attachMovie("elem", "elem" + _root.getNextHighestDepth(), _root.getNextHighestDepth(), elemProp);
			// 要素初期化 : 3次元X, Y, Z, 焦点, 消失点X, Y
			elem.initElem(x, y, z, fl, vpx, vpy);
		}
	};
}
var o = new Controller();
// 初期化 : 焦点, 消失点X, Y
o.initController(250, 10, 200);

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。