roadProgram的专栏

一个程序员的路

flash 伪3D

 

 虚拟一个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;

可以很据计算 做出很多效果

阅读更多
个人分类: as3D
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭