package { import flash.display.Sprite; import flash.events.Event; public class RotateY extends Sprite { private var balls:Array; private var numBalls:uint=50; private var fl:Number=250; private var vpX:Number=stage.stageWidth/2; private var vpY:Number=stage.stageHeight/2; public function RotateY() { init(); } private function init():void { balls = new Array(); for (var i:uint = 0; i < numBalls; i++) { var ball:Ball3D=new Ball3D(10,Math.random()*0xffffff); balls.push(ball); ball.xpos=Math.random()*200-100; ball.ypos=Math.random()*200-100; ball.zpos=(Math.random()*2-1)*100; addChild(ball); } addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(event:Event):void { var angleY:Number = (mouseX - vpX) * .0004;//旋转的角度与鼠标的水平位置关联 for (var i:uint = 0; i < numBalls; i++) { var ball:Ball3D=balls[i]; rotateY(ball, angleY); } sortZ(); } //绕y轴旋转 private function rotateY(ball:Ball3D, angleY:Number):void { var cosY:Number=Math.cos(angleY); var sinY:Number=Math.sin(angleY); var x1:Number=ball.xpos*cosY-ball.zpos*sinY; var z1:Number=ball.zpos*cosY+ball.xpos*sinY; ball.xpos=x1; ball.zpos=z1; if (ball.zpos>- fl) { var scale:Number = fl / (fl + ball.zpos); ball.scaleX=ball.scaleY=scale; ball.x=vpX+ball.xpos*scale; ball.y=vpY+ball.ypos*scale; ball.alpha = scale*0.8; ball.visible=true; } else { ball.visible=false; } } private function sortZ():void { balls.sortOn("zpos", Array.DESCENDING | Array.NUMERIC); for (var i:uint = 0; i < numBalls; i++) { var ball:Ball3D=balls[i]; setChildIndex(ball, i); } } } }