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; 可以很据计算 做出很多效果 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |