flash 3d 旋转模型

参考flash animation 做的flash 3d旋转模型,有点意思。代码要好好消化下,争取都记下来~

鼠标划过试试啊~~

文本类代码:

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    /**
    * ...
    * @author ...
    */
    public class A274 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 A274()
        {
            init();
        }
        private function init():void
        {
            _balls = new Array();
            for (var i:uint = 0; i < _numBalls; i++)
            {
                var ball:Ball = new Ball(15);
                _balls.push(ball);
                ball.xpos = Math.random() * 200 - 100;
                ball.ypos = Math.random() * 200 - 100;
                ball.zpos = Math.random() * 200 - 100;
                addChild(ball);
            }
            addEventListener(Event.ENTER_FRAME , onEnFrame);
        }
        private function onEnFrame(evt:Event):void
        {
            var angleY:Number = (mouseX - _vpX) * 0.001;
            var angleX:Number = (mouseY - _vpY) * 0.001;
            for (var i:uint = 0; i < _numBalls; i++)
            {
                var ball:Ball = _balls[i];
                rotateY(ball , angleY);
                rotateX(ball , angleX);
            }
            sortZ();
        }
        private function rotateY(ball:Ball , angleY:Number):void
        {
            var cosY:Number = Math.cos(angleY);
            var sinY:Number = Math.sin(angleY);
            var x1:Number = cosY * ball.xpos - sinY * ball.ypos;
            var y1:Number = cosY * ball.ypos + sinY * ball.xpos;
            ball.xpos = x1;
            ball.ypos = y1;
            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.visible = true;
            }else
            {
                ball.visible = false;
            }
        }
        private function rotateX(ball:Ball , angleX:Number):void
        {
   var cosX:Number = Math.cos(angleX);
   var sinX:Number = Math.sin(angleX);
   var y1:Number = ball.ypos * cosX - ball.zpos * sinX;
   var z1:Number = ball.zpos * cosX + ball.ypos * sinX;
   ball.ypos = y1;
   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.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:Ball = _balls[i];
                setChildIndex(ball , i+1); //因为背景我画了个渐变,所以把所有图层都往上提一层
            }
        }
    }
}

ball类代码:

package
{
 import flash.display.GradientType;
    import flash.display.Sprite;
 import flash.geom.Matrix;
    public class Ball extends Sprite
    {
        public var vx:Number = 0;
        public var vy:Number = 0;
  public var vz:Number = 0;
  public var xpos:Number = 0;
  public var ypos:Number = 0;
  public var zpos:Number = 0;
        public var radius:Number;
        public var color:uint;
  public var mass:Number = 1;
        public function Ball(_radius:Number = 40 , _color:uint = 0xF2BF33)
        {
   radius = _radius;
   color = _color;
   var colors:Array = [0xffffff, color,0x440000];
   var ratios:Array = [0,255, 210];
   var alphas:Array = [1, 1, 1];
   var matrix:Matrix = new Matrix();
   matrix.createGradientBox( radius,radius,0,-radius/4,-radius/4*3);
            graphics.beginGradientFill(GradientType.RADIAL,colors,alphas,ratios,matrix);
            graphics.drawCircle(0 , 0 , radius);
            graphics.endFill();
        }
    }
}

版权所有©摇太阳网站 鄂ICP备09010653号
Copyright By Email:mail@yaotaiyang.com