flash 偽3D

來源:互聯網
上載者:User

 

 虛擬一個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;

可以很據計算 做出很多效果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.