0点透視法で表現された3次元の回転 : ActionScript -3D-

Pocket

回転行列を使った3D回転の覚書。

////////////////////////////////////////////////////////////////////////////////
//
//
//  0点透視法で表現された3次元の回転
//
//
////////////////////////////////////////////////////////////////////////////////
function Elem(x, y, z)
{
	// 焦点
	var fl = 250;
	// 3D空間	座標
	var x3D = x;
	var y3D = y;
	var z3D = z;
	// 3D空間	中心座標
	var cx3D;
	var cy3D;
	var cz3D;
	// 初期化 : 3D空間X, Y, Z, 3D空間中心X, Y, Z
	this.initElem = function(argX3D, argY3D, argZ3D, argCx3D, argCy3D, argCz3D)
	{
		// 3D空間	座標
		x3D = argX3D;
		y3D = argY3D;
		z3D = argZ3D;
		// 3D空間	中心座標
		cx3D = argCx3D;
		cy3D = argCy3D;
		cz3D = argCz3D;
	};
	// 投影(0点透視法 スケールのみ変更
	this.projection = function()
	{
		var scale:Number = fl / (fl + z3D + cz3D);
		this._x = x3D;
		this._y = y3D;
		this._xscale = this._yscale = scale * 100;
	};
	// X軸を固定した回転
	this.rotateX = function(angle:Number)
	{
		var cos:Number = Math.cos(angle);
		var sin:Number = Math.sin(angle);
		var dy:Number = y3D - cy3D;
		var dz:Number = z3D - cz3D;
		dy = dy * cos - dz * sin;
		dz = dz * cos + dy * sin;
		y3D = dy+ cy3D;
		z3D = dz+ cz3D;
	};
	// Y軸を固定した回転
	this.rotateY = function(angle:Number)
	{
		var cos:Number = Math.cos(angle);
		var sin:Number = Math.sin(angle);
		var dx:Number = x3D - cx3D;
		var dz:Number = z3D - cz3D;
		dx = dx * cos - dz * sin;
		dz = dz * cos + dx * sin;
		x3D = dx + cx3D;
		z3D = dz + cz3D;
	};
	// Y軸を固定した回転
	this.rotateZ = function(angle:Number)
	{
		var cos:Number = Math.cos(angle);
		var sin:Number = Math.sin(angle);
		var dx:Number = x3D - cx3D;
		var dy:Number = y3D - cy3D;
		dx = dx * cos - dy * sin;
		dy = dy * cos + dx * sin;
		x3D = dx + cx3D;
		y3D = dy + cy3D;
	};
}
var elem:MovieClip;
elem = _root.attachMovie('elem', 'elem' + _root.getNextHighestDepth(), _root.getNextHighestDepth(), new Elem());
// 初期化 : 3D空間X, Y, Z, 3D空間中心X, Y, Z
elem.initElem(500, 300, 0, 300, 200, 0);
_root.onEnterFrame = moving;
function moving()
{
	var angle:Number = 0.05;
	// X軸に沿った回転
	elem.rotateX(angle);
	//elem.rotateY(angle);
	//elem.rotateZ(angle);
	// 投影
	elem.projection();
}

コメント

No comments yet.

コメントの投稿

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