先来看看图片讲解的公式
数学公式:
X=cosA*R;
y=sinA *R;
Z+=H;
转化为屏幕投影的公式:
X=cosA*R;
Z=sinA *R;
Y+=H;
以下是源码(可调整参数变量,实现不同的视觉效果):
package
{
import flash.display.MovieClip;
import flash.events.*;
import flash.geom.PerspectiveProjection;
[SWF(width = "700", height = "480", frameRate = "25")];
/**
* ...
* @author .....Li灬Star
* @contact...QQ:168527720
*/
public class LuoXuan extends MovieClip
{
private var pointNum:int = 50; //螺旋点的数目
private var rotationNum:int = 3; //螺旋的圈数
private var anglePer:Number; //旋转的弧度
private var radius:Number = 200; //半径
private var _height:Number = 0; //高度
private var imgArr:Array = new Array();
private var container:MovieClip = new MovieClip();
public function LuoXuan()
{
init();
}
private function init():void {
root.transform.perspectiveProjection.fieldOfView = 50; //初始化透视角度
this.addChild(container);
container.x = stage.stageWidth / 2;
container.y = stage.stageHeight / 2 - 500;
container.z = 1000;
setObject3D();
}
private function setObject3D():void {
anglePer = ((2 * Math.PI) * rotationNum) / pointNum;
for (var i:int = 0; i < pointNum; i++ ) {
var img:Image = new Image();
imgArr.push(img);
container.addChild(img);
img.x = Math.cos(anglePer * i) * radius;
img.z = Math.sin(anglePer * i) * radius;
img.y = _height += 30; //每张图片的高度递增30
img.rotationY = ( -i * anglePer) * (180 / Math.PI) + 90; //偏移角度,弧度转换为度
img.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
}
private function enterFrameHandler(e:Event):void {
container.rotationY+=0.01;
sortZ(); //Z轴排序
}
private function sortZ():void {
imgArr.sortOn("z", Array.CASEINSENSITIVE | Array.NUMERIC);
for (var i:int = 0; i < imgArr.length; i++) {
var imgCopy:Image = imgArr[i];
container.setChildIndex(imgCopy, i);
}
}
}
}