回転行列を使った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.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。