学习网站建设,网页知识,电脑技巧,AS3代码,FLASH效果,课件制作,网络学习,运动生活,心情日志博客
2009年12月15日AS3 学习

0 条评论

FLASH 3D双环代码解读

var map:BitmapData=new Pic(0,0);//加载库中位图数据
var sp0:Sprite=new Sprite();//容器,用于绘图
addChild(sp0);
var con:Sprite=new Sprite();//总容器,用于放两个环
addChild(con);
sp0.x=con.x=275,sp0.y=con.y=200,con.z=0;
var arr:Array=[],arr1:Array=[],arr2:Array=[],quan:int=40,num:int=10,ang:Number=360/quan,f=500;//arr放所有点,用于计算每个点的2D投影坐标,arr1(二维数数)放所有点,用于设置点的绘制顺序,arr2存每个方块,含它们的V,I,U,Z
for (var m=0; m<2; m++) {
var sp:Sprite=new Sprite();//环容器,用于放mc点
con.addChild(sp);
sp.z=m*160-80;//两个环的z
//sp.transform.matrix3D.prependRotation(m*60,Vector3D.Z_AXIS);
//两个环的绕z相差60度
for (var i=0; i<=quan; i++) {
arr1[i+m*41]=[];//两个环共82个小圈(0-40,41-81),每个小圈中有11份,这个二维数组共存902个点
for (var j=0; j<=num; j++) {
var mc:MovieClip=new MovieClip();//用mc存储点的位置
sp.addChild(mc);
mc.x=(m==0)?50+15*Math.cos(j*2*Math.PI/num):15*Math.cos(j*2*Math.PI/num);//50改为100,变回环嵌套,现在是连体
mc.y=(m==0)?15*Math.sin(j*2*Math.PI/num):100+15*Math.sin(j*2*Math.PI/num);
mc.z=0;//当m为0时,圆平放,为1时竖放
if (m==0) {
mc.transform.matrix3D.appendRotation(i*ang,Vector3D.Y_AXIS);
//让坐标点在大圆周上分布
} else {
mc.transform.matrix3D.appendRotation(i*ang,Vector3D.X_AXIS);
}
arr.push(mc);
//放所有点,用于获取每个3D点的二维投影坐标,存入动态属性rx,ry
arr1[i+m*41].push(mc);
//放所有点于二维数组中,用于设置drawTriangles的三角形顶点
}
}
}
//trace(arr.length);//902
var rh=arr1.length-1,rw=arr1[0].length-1;//rh纬线数最大索引81,rw经线数最大索引10
addEventListener(Event.ENTER_FRAME,frame);
function frame(e:Event) {
sp0.graphics.clear();
arr2=[];
con.transform.matrix3D.prependRotation((275-mouseX)/50,Vector3D.Y_AXIS);
con.transform.matrix3D.prependRotation((mouseY-200)/50,Vector3D.X_AXIS);
//总容器绕自身Y,X轴随鼠标动
for (var i=0; i<arr.length; i++) {
arr[i].rz=arr[i].transform.getRelativeMatrix3D(sp0).position.z;
arr[i].rx=arr[i].transform.getRelativeMatrix3D(sp0).position.x*(f/(f+arr[i].rz));
arr[i].ry=arr[i].transform.getRelativeMatrix3D(sp0).position.y*(f/(f+arr[i].rz));//加入了焦距控制,符合透视原理,求出三D点的二D投影坐标
}
for (var h=0; h<rh; h++) {
for (var k=0; k<rw; k++) {
var varr:Vector.<Number>=Vector.<Number>([arr1[h][k].rx,arr1[h][k].ry,arr1[h+1][k].rx,arr1[h+1][k].ry,arr1[h+1][k+1].rx,arr1[h+1][k+1].ry,arr1[h][k+1].rx,arr1[h][k+1].ry]);//坐标
var indices:Vector.<int>=Vector.<int>([0,1,3,1,2,3]);//画三角形的顶点顺序
var uvt:Vector.<Number>=Vector.<Number>([h/rh*2,k/rw*2,(h+1)/rh*2,k/rw*2,(h+1)/rh*2,(k+1)/rw*2,h/rh*2,(k+1)/rw*2]);//分割位图的比例
h!=40?arr2.push({V:varr,I:indices,U:uvt,Z:arr1[h][k].rz+arr1[h+1][k].rz+arr1[h+1][k+1].rz+arr1[h][k+1].rz}):0;//当h==40时,如果也压入UVTZ,会把两个环的绘制起点首尾相连,,,z是四个点z坐标总和,用于后面的排序
}
}
arr2.sortOn("Z",18);
for (var n=0; n<arr2.length; n++) {
//sp0.graphics.lineStyle(1,0xff0000);
sp0.graphics.beginBitmapFill(map);
sp0.graphics.drawTriangles(arr2[n].V,arr2[n].I,arr2[n].U,TriangleCulling.NONE);//画三角形,背面不剔除
sp0.graphics.endFill();
}
}
sp0.transform.colorTransform=new ColorTransform(1,1,1,1,50,50,50);//提高一点填充的亮度,图是画在sp0中的,点放在两个sp中,两个sp放在con中

本文地址:http://www.lxlong.net/archives/97.html

本文标题:FLASH 3D双环代码解读

 
« »                

没有评论

发表评论 »