基于as3实现的简单3d地球

本文介绍了一个使用ActionScript 3 (AS3) 实现的图像球体绘制项目。通过构建三角网格并应用位图填充,实现了围绕x轴旋转的球体效果。文章提供了完整的源代码,并介绍了关键的数据结构和绘制方法。

 

经过我一天的努力 总算是弄好了 哈哈 虽然很菜,但是总算弄出个东西了,这个是以x轴为中心点转动,暂时没有加进交互。

 

ContractedBlock.gifExpandedBlockStart.gifCode
  1 package
  2 {
  3     import __AS3__.vec.Vector;
  4     
  5     import flash.display.Bitmap;
  6     import flash.display.Sprite;
  7     import flash.display.StageAlign;
  8     import flash.display.StageScaleMode;
  9     import flash.display.TriangleCulling;
 10     import flash.events.Event;
 11     
 12     [SWF(backgroundColor=0x000000, width=800, height=800)]
 13     public class ImageSphere1 extends Sprite
 14     {
 15         [Embed(source="map.jpg")]
 16         private var ImageClass:Class;
 17         
 18         private var vertices:Vector.<Number> = new Vector.<Number>();
 19         private var indices:Vector.<int> = new Vector.<int>();
 20         private var uvtData:Vector.<Number> = new Vector.<Number>();
 21         private var bitmap:Bitmap;
 22         private var sprite:Sprite;
 23         private var centerZ:int = 500;
 24         private var cols:int = 20;
 25         private var rows:int =20;
 26         private var focalLength:Number = 1000;
 27         private var radius:Number = 200;
 28         private var offset:int = 0;
 29         private var zSaver:Array=[];
 30         private var xSaver:Array=[];
 31         private var ySaver:Array=[];
 32         private var DAngle:Number = .02;
 33         public function ImageSphere1()
 34         {
 35             stage.align = StageAlign.TOP_LEFT;
 36             stage.scaleMode = StageScaleMode.NO_SCALE;
 37             
 38             sprite = new Sprite();
 39             sprite.x = 400;
 40             sprite.y = 400;
 41             addChild(sprite);
 42             
 43             bitmap= new ImageClass() as Bitmap;
 44             makeTriangles();
 45             
 46             
 47         }
 48         
 49     private function onEnterFrame(event:Event):void
 50         {
 51             draws();
 52         }
 53         
 54 
 55         private function makeTriangles():void
 56         {   vertices.length = 0;
 57             uvtData.length = 0;
 58             var zpos:Number =0;
 59             var ypos:Number =0;
 60             var xpos:Number = 0;
 61             for(var i:int = 0; i < rows; i++)
 62             {
 63                 for(var j:int = 0; j < cols; j++)
 64                 {
 65                     if(i < rows - 1 && j < cols - 1)
 66                     {
 67                         indices.push(i * cols + j,
 68                                      i * cols + j + 1,
 69                                     (i + 1* cols + j);
 70                                     
 71                         indices.push(i * cols + j + 1,
 72                                     (i + 1* cols + j + 1,
 73                                     (i + 1* cols + j);
 74                         
 75                     }
 76 
 77                         var angle:Number =Math.PI *2/ (rows - 1* j;
 78                         var dR:Number=2*radius/(rows-1);
 79                         var scale:Number =0;
 80                          
 81                                  ypos=   radius-i*dR;
 82                                  ySaver.push(ypos);
 83                                  
 84                                  zpos= Math.cos(angle)*Math.sqrt(radius*radius-ypos*ypos);
 85                                  zSaver.push(zpos);
 86                                  
 87                                  xpos= Math.sin(angle)*Math.sqrt(radius*radius-ypos*ypos);
 88                                  xSaver.push(xpos);
 89                                    
 90                                   scale= focalLength / (focalLength + zpos + centerZ);
 91                                  vertices.push(xpos * scale, ypos * scale);
 92                                  
 93                                  uvtData.push(j / (cols - 1), i / (rows - 1));
 94                                  uvtData.push(scale);
 95                                 
 96 
 97                 }//for
 98             }//for
 99        
100             sprite.graphics.clear();
101 
102             
103         sprite.graphics.lineStyle(15, .8);
104         //graphics.beginFill(0xFF8F05);
105         sprite.graphics.drawTriangles(vertices, indices, uvtData);
106          trace("ini is:",vertices);
107              addEventListener(Event.ENTER_FRAME, onEnterFrame);
108         }//f ends
109         
110         private function draws():void
111         {    
112 
113             offset++;
114             if(offset>=1) {
115             
116             offset=0;
117             vertices.length = 0;
118 
119             
120             
121         for(var i:int = 0; i < zSaver.length; i++)
122             {
123                          
124                          
125                         ySaver[i]= Math.cos(DAngle)*ySaver[i]-Math.sin(DAngle)*zSaver[i];
126                         
127                         zSaver[i]= Math.cos(DAngle)*zSaver[i]+Math.sin(DAngle)*ySaver[i];
128                         
129                         var scale:Number= focalLength / (focalLength +  zSaver[i] + centerZ);
130                         vertices.push(xSaver[i] * scale, ySaver[i] * scale); 
131                         if(i*3+2<=uvtData.length) uvtData[i*3+2]=scale;
132                                 
133             }
134 
135             sprite.graphics.clear();
136             
137             sprite.graphics.beginBitmapFill(bitmap.bitmapData);
138             //sprite.graphics.beginFill(0x628f06);
139             //
140             sprite.graphics.drawTriangles(vertices, indices,uvtData, TriangleCulling.NEGATIVE);
141             sprite.graphics.endFill();
142            // sprite.graphics.lineStyle(1, 5, .8);
143             //graphics.beginFill(0xFF8F05);
144             //sprite.graphics.drawTriangles(vertices, indices, uvtData, TriangleCulling.NEGATIVE);
145             trace(uvtData.length);
146             trace(zSaver.length);
147             }
148         }//f end
149         
150     }
151 }

转载于:https://www.cnblogs.com/sun11086/archive/2009/03/04/1403091.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值