[ActionScript 3.0] AS3 3D双圆环贴图

  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 [email protected]
 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 }
时间: 2024-10-14 01:42:50

[ActionScript 3.0] AS3 3D双圆环贴图的相关文章

[ActionScript 3.0] AS3 3D星形贴图

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.Vector3D; 10 11

[ActionScript 3.0] as3处理xml的功能和遍历节点

as3比as2处理xml的功能增强了N倍,获取或遍历节点非常之方便,类似于json对像的处理方式. XML 的一个强大功能是它能够通过文本字符的线性字符串提供复杂的嵌套数据.将数据加载到 XML 对象时,ActionScript 会分析数据并将其分层结构加载到内存(如果 XML 数据格式有误,它会发送运行时错误). 利用 XML 和 XMLList 对象的运算符和方法可以轻松遍历 XML 数据的结构. 1.读取外部 XML 文档 可以使用 URLLoader 类从 URL 加载 XML 数据.若

[ActionScript 3.0] AS3实现3D旋转

1 package 2 { 3 import flash.display.Bitmap; 4 import flash.display.BitmapData; 5 import flash.display.DisplayObject; 6 import flash.display.Sprite; 7 import flash.events.MouseEvent; 8 import flash.events.TimerEvent; 9 import flash.geom.PerspectivePr

[ActionScript 3.0] AS3 绘制正八面体(线条)

分析: 将八面体置于3D坐标系中,其中心的坐标位于原点(0,0,0),让八面体的六个顶点恰好位于3D坐标系的x轴.y轴和z轴上,则从八面体的中心到这六个顶点的距离是相等的.我们可以假设这个距离为r,则六个顶点的坐标分别为上(0,-r,0).下(0,r,0).四周:左(-r,0,0).右(r,0,0).前(0,0,-r).后(0,0,r). 1 package 2 { 3 import flash.display.MovieClip; 4 import flash.display.Sprite;

[ActionScript 3.0] AS3 深入理解Flash的安全沙箱Security Domains

简介 如果你还没有与复杂的的安全域(security domain)和应用程序域(application domain)问题打过交道,那么你真是个幸运的家伙.当你在加载外部内容(然后他们开始播放)的时候,默认的设置工作的很好,你甚至不知道他们的存在. 但是某些时候你可能需要控制默认设置以外的更多行为和功能,这样你就会遇到前面所说的问题.你也许会困扰于Security.allowDomain和crossdomain.xml文件的区别,又或者你想要深究关于安全性的最佳实践.如果是这样,那么这篇文章就

[ActionScript 3.0] AS3.0和AS2.0的相互通信

AS3和AS2之间的通信,最好的方式可能就是LocalConnection了. AS2向AS3发送数据,即AS2调用AS3的函数: as2.0代码(按钮上写的发送信息代码): on (release) { var param = "this message is from as2"; var caller:LocalConnection = new LocalConnection(); caller.send("AS2 send to AS3","funI

[ActionScript 3.0] AS3虚线绘制方法

import flash.geom.Point; import flash.display.MovieClip; import flash.display.Graphics; var mc:MovieClip=new MovieClip(); addChild(mc); drawDashed(mc,new Point(100,100),new Point(500,100),5,5); function drawDashed(mc:Sprite,p1:Point,p2:Point,length:N

[ActionScript 3.0] AS3 对XML的操作,创建、删除、增加节点方法

package { import flash.display.Sprite; /** * @author:Frost.Yen * @E-mail:[email protected] * @create: 2016-3-11 上午11:31:11 * */ public class OperateXML extends Sprite { private var _xml:XML = <data> <item>item1</item> <item>item2&l

[ActionScript 3.0] AS3.0 对象在一定范围随机显示不重叠

import flash.geom.Rectangle; import flash.display.MovieClip; import flash.display.Sprite; var arr:Array = []; var dis:Number = 20;//间距 var len:int=15;//对象数量 var bound:Rectangle = new Rectangle(0,0,1000,800);//显示范围 for(var i:int = 0;i<len;i++){ var ob