1 package 2 { 3 import flash.display.Bitmap; 4 import flash.display.BitmapData; 5 import flash.display.MovieClip; 6 import flash.display.Sprite; 7 import flash.display.TriangleCulling; 8 import flash.events.Event; 9 import flash.geom.ColorTransform; 10 import flash.geom.Vector3D; 11 12 /** 13 * @author Frost.Yen 14 * @E-mail 871979853@qq.com 15 * @create 2015-9-11 下午2:59:18 16 * 17 */ 18 [SWF(width="1024",height="768")] 19 public class RingTexture extends Sprite 20 { 21 [Embed(source="test.jpg")] 22 private var _img:Class; 23 private var _bmpd:BitmapData; 24 private var _pointContainer:Sprite; 25 private var _graphicContainer:Sprite; 26 private var _ringContainer:Sprite; 27 private var _pointArr:Array = [];//放全部點,用於計算每一個點的2D投影座標 28 private var _arr1:Array = [];//_arr1(二維數數)放全部點,用於設置點的繪製順序 29 private var _arr2:Array = [];//_arr2存每一個方塊,含它們的V,I,U,Z 30 private var _circle:int=40;//環上的圓圈個數 31 private var _num:int = 10; 32 private var _ang:Number = 360/_circle; 33 private var _focus:Number = 500; 34 private var _h:int; 35 private var _w:int; 36 public function RingTexture() 37 { 38 initViews(); 39 initEventListeners(); 40 } 41 private function initViews():void 42 { 43 _pointContainer = new Sprite(); 44 _graphicContainer = new Sprite(); 45 _ringContainer = new Sprite(); 46 _ringContainer.x = _graphicContainer.x = this.stage.stageWidth*0.5; 47 _ringContainer.y = _graphicContainer.y = this.stage.stageHeight*0.5; 48 _ringContainer.z = 0;//必須寫,不要認爲0是它的默認值 49 _bmpd = (new _img() as Bitmap).bitmapData; 50 _graphicContainer.transform.colorTransform=new ColorTransform(1,1,1,1,50,50,50);//提升一點填充的亮度,圖是畫在_graphicContainer中的 51 this.addChild(_ringContainer); 52 this.addChild(_graphicContainer); 53 createRing(); 54 } 55 private function initEventListeners():void 56 { 57 this.addEventListener(Event.ENTER_FRAME,onEnterFrame); 58 } 59 private function onEnterFrame(e:Event):void{ 60 _graphicContainer.graphics.clear(); 61 _arr2 = []; 62 //總容器繞自身Y,X軸隨鼠標動 63 _ringContainer.transform.matrix3D.prependRotation((_graphicContainer.x-mouseX)/50,Vector3D.Y_AXIS); 64 _ringContainer.transform.matrix3D.prependRotation((mouseY-_graphicContainer.y)/50,Vector3D.X_AXIS); 65 for(var i:int = 0;i<_pointArr.length;i++){ 66 _pointArr[i].Z=(_pointArr[i] as MovieClip).transform.getRelativeMatrix3D(_graphicContainer).position.z; 67 _pointArr[i].X=(_pointArr[i] as MovieClip).transform.getRelativeMatrix3D(_graphicContainer).position.x*(_focus/(_focus+_pointArr[i].Z)); 68 _pointArr[i].Y=(_pointArr[i] as MovieClip).transform.getRelativeMatrix3D(_graphicContainer).position.y*(_focus/(_focus+_pointArr[i].Z));//加入了焦距控制,符合透視原理,求出3D點的2D投影座標 69 } 70 for(i=0;i<_h;i++){ 71 for(var k:int = 0;k<_w;k++){ 72 var vertices:Vector.<Number>=Vector.<Number>([_arr1[i][k].X,_arr1[i][k].Y,_arr1[i+1][k].X,_arr1[i+1][k].Y,_arr1[i+1][k+1].X,_arr1[i+1][k+1].Y,_arr1[i][k+1].X,_arr1[i][k+1].Y]);//座標 73 var indices:Vector.<int>=Vector.<int>([0,1,3,1,2,3]);//畫三角形的頂點順序 74 var uvtData:Vector.<Number>=Vector.<Number>([i/_h*2,k/_w*2,(i+1)/_h*2,k/_w*2,(i+1)/_h*2,(k+1)/_w*2,i/_h*2,(k+1)/_w*2]);//分割位圖的比例 75 i!=40?_arr2.push({V:vertices,I:indices,U:uvtData,Z:_arr1[i][k].Z+_arr1[i+1][k].Z+_arr1[i+1][k+1].Z+_arr1[i][k+1].Z}):0;//當h==40時,若是也壓入UVTZ,會把兩個環的繪製起點首尾相連,,,Z是四個點z座標總和,用於後面的排序 76 77 } 78 } 79 _arr2.sortOn("Z",18); 80 for(i = 0;i<_arr2.length;i++){ 81 //_graphicContainer.graphics.lineStyle(1,0xff0000); 82 _graphicContainer.graphics.beginBitmapFill(_bmpd); 83 _graphicContainer.graphics.drawTriangles(_arr2[i].V,_arr2[i].I,_arr2[i].U,TriangleCulling.NONE);//畫三角形,背面不剔除 84 _graphicContainer.graphics.endFill(); 85 } 86 } 87 private function createRing():void 88 { 89 for(var m:int = 0;m<2;m++){ 90 var sp:Sprite = new Sprite();//環容器,用於存放mc點 91 _ringContainer.addChild(sp); 92 sp.z = m*160-80; 93 for(var i:int=0;i<=_circle;i++){ 94 _arr1[i+m*41] = [];//兩個環共82個小圈(0-40,41-81),每一個小圈中有11份,這個二維數組共存902個點 95 for(var j:int = 0;j<=_num;j++){ 96 var mc:MovieClip = new MovieClip(); 97 sp.addChild(mc); 98 mc.x=(m==0)?90+15*Math.cos(j*2*Math.PI/_num):15*Math.cos(j*2*Math.PI/_num);//90改成50,變成連體,如今是嵌套 99 mc.y=(m==0)?15*Math.sin(j*2*Math.PI/_num):100+15*Math.sin(j*2*Math.PI/_num); 100 mc.z = 0;//當m爲0時,圓平放,爲1時豎放 101 if(m==0){ 102 //讓座標點在大圓周上分佈 103 mc.transform.matrix3D.appendRotation(i*_ang,Vector3D.Y_AXIS); 104 }else{ 105 mc.transform.matrix3D.appendRotation(i*_ang,Vector3D.X_AXIS) 106 } 107 //放全部點,用於獲取每一個3d點的二維投影座標,存入動態屬性X,Y 108 _pointArr.push(mc); 109 //放全部點於二維數組中,用於設置drawTriangles的三角形頂點 110 _arr1[i+m*41].push(mc); 111 } 112 } 113 114 } 115 _h = _arr1.length-1; 116 _w = _arr1[0].length - 1;//_h緯線數最大索引81,_w經線數最大索引10 117 } 118 } 119 }