虛擬一個3D 情境
var scene = new Sprite;
scene.x = stage.stageWidth/2;
scene.y = stage.stageHeight/2;
addChild(scene);
虛擬一個焦距
var focus = 300;
虛擬一個3D物體 (連結到庫裡面 ,起個class 名字比如HongLv)
var _honglv = new HongLv;
_honglv._3dx = 200;
_honglv._3dy = 100;
_honglv._3dz = 50;
scene.addChild(_honglv);
計算這個虛擬3D物體,投影到scene的x,y座標
var scale = focus/(focus+_honglv._3dz);
_honglv.x = _honglv._3dx*scale;
_honglv.y = _honglv._3dy*scale;
_honglv.scaleX = _honglv.scaleY = scale;
////////////////////////////////////////////////////////////////////////////////////
虛擬一個攝像機camera
camera 其實就一個object 一個點或者一個座標
var camera = new Object;
camera.x = 0;
camera.y = 0;
camera.z = 0;
移動攝像機(其實就是一個相對座標的關係),專門為camera 設定個移動速度
camera.speed_z = 300;
當然攝像機還有個方向(direction)
camera.direction = 1;
比如移動camera.z++或者--
addEventListener(Event.ENTER_FRAME,move);
function move(e:Event){
camera.z += camera.speed_z*camera.direction;
你可以控制運動距離改變方向
然後再計算_honglv與camera的對應關係
var scale = focus/(focus+_honglv._3dz-camera.z);
_honglv.x = (_honglv._3dx-camera.x)*scale;
_honglv.y = (_honglv._3dy-camera.y)*scale;
_honglv.scaleX = _honglv.scaleY = scale;
}
旋轉也是一樣的,旋轉那就是對應角度啦////////////////////////////////-------------只是旋轉,那麼物體的座標可以有radius 跟角度 控制位置
旋轉有倆個屬性 一個是角度 一個就是半徑啦
_honglv.angle = 30;
_honglv.radius = 300;
//-------------------比如繞Y周旋轉
_honglv._3dx = Math.cos(_honglv.angle)*_honglv.radius;
_honglv._3dz = Math.sin(_honglv.angle)*_honglv.radius;
_honglv._3dy = 200;
添加個屬性camera.angle = 30;
那麼就有
var angle = _honglv.angle-camera.angle;
var x_pos = Math.cos(angle)*_honglv.radius-camera.x;
var z_pos = Math.sin(angle)*_honglv.radius-camera.z;
var y_pos = _honglv._3dy-camera.y;
var scale = focus/(focus+z_pos);
_honglv.x = x_pos*scale;
_honglv.y = y_pos*scale;
_honglv.scaleX = _honglv.scaleY = scale;
這時候只需要修改camera.angle 就可以啦
上面簡單的介紹了 攝像機的移動跟旋轉(根據攝像機的z改變scale達到3D的效果和控制攝像機的角度,間接的修改物體的x,y,z)
如果是移動加旋轉呢?
同樣的道理
移動我們知道 跟攝像機的座標有關係
旋轉跟角度 半徑有關係 但是都是相對的
那就先求出相對位置 根據位置求出角度,半徑那麼就有
var x_pos =_honglv._3dx-camera.x;
var y_pos = _honglv._3dy-camera.y;
var z_pos = _honglv._3dz-camera.z;
角度
var angle = Math.atan2(z_pos,x_pos);
var radius = Math.sqrt(z_pos*z_pos+x_pos*x_pos);
根據攝像機的角度重新計算出x_pos z_pos
x_pos = Math.cos(angle+camera.angle)*radius;
z_pos = Math.sin(angle+camera.angle)*radius;
然後縮放
var scale = focus/(focus+z_pos);
_honglv.x = x_pos*scale;
_honglv.y = y_pos*scale;
_honglv.scaleX = _honglv.scaleY = scale;
可以很據計算 做出很多效果