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();
}
}
}
