zoukankan      html  css  js  c++  java
  • flash 3D练习“轮胎”

    个人学习flash

      1 import fl.events.SliderEvent;
      2 import fl.controls.CheckBox; 
      3 imgselect.setStyle("textFormat",new TextFormat("宋体",14,0xffffff)); 
      4 var sp:Sprite =addChild(new Sprite()) as Sprite;
      5 sp.x=stage.stageWidth/2;
      6 sp.y=stage.stageHeight/2;
      7 sp.z=0;
      8 var mypic:Pic=new Pic(0,0);
      9 var i_num:int=30;//环切片分割数
     10 var j_num:int=20;//切片内扇形数
     11 var R:Number=0;//环的半径
     12 var r:Number=60;//切片的半径
     13 var i:int;
     14 var j:int;
     15 var arr3D:Vector.<Number>;
     16 var new_arr3D:Vector.<Number>;//
     17 var arr2D:Vector.<Number>;
     18 var uvt:Vector.<Number>;
     19 var vindicies:Vector.<int>;
     20 var mtxworld:Matrix3D=new Matrix3D();//改变点坐标的矩阵
     21 var pm:Matrix3D=sp.transform.matrix3D;//实现投影转换的投影 Matrix3D 对象
     22 pm.prependTranslation(-137.5,-100,0);
     23 
     24 var Rotation:Boolean;
     25 var f:Number=1000;
     26 var _oldMousePoint:Point=new Point  ;
     27 init(R,r,i_num,j_num);
     28 function init(R:Number=120,r:Number=30,i_num:int=30,j_num:int=20) {
     29     arr3D=new Vector.<Number>();
     30     arr2D=new Vector.<Number>();
     31     new_arr3D=Vector.<Number>([]);
     32     uvt=Vector.<Number>([]);
     33     vindicies=Vector.<int>([]);
     34     for (i=0; i<=i_num; i++) {
     35         for (j=0; j<=j_num; j++) {
     36             var temp_x:Number =-(R+r*Math.cos(j*(2*Math.PI/j_num)))*Math.cos(i*(2*Math.PI/i_num));
     37             var temp_z:Number=-r*Math.sin(j*(2*Math.PI/j_num));//trace("j="+j+",y="+temp_y)
     38             var temp_y:Number=-(R+r*Math.cos(j*(2*Math.PI/j_num)))*Math.sin(i*(2*Math.PI/i_num));
     39             arr3D.push(temp_x,temp_y,temp_z);
     40             uvt.push(i/i_num,j/j_num,1);//f/(f+100+temp_z)
     41         }
     42     }
     43     for (i=0; i<i_num; i++) {
     44         for (j=0; j<j_num; j++) {
     45             vindicies.push(i*(j_num+1)+j,i*(j_num+1)+(j+1),(i+1)*(j_num+1)+(j+1),(i+1)*(j_num+1)+(j+1),(i+1)*(j_num+1)+j,i*(j_num+1)+j);
     46         }
     47     }
     48     render(imgselect.selected);
     49     auto_btn.addEventListener(MouseEvent.CLICK, autoHandler);
     50     hand_btn.addEventListener(MouseEvent.CLICK, handHandler);
     51     mov_btn.addEventListener(MouseEvent.CLICK, movHandler);
     52 }
     53 
     54 
     55 
     56 
     57 function render(isFill:Boolean=true,degreX:Number=0,degreY:Number=0,degreZ:Number=0,TranslationX:Number=0,TranslationY:Number=0,TranslationZ:Number=0) {
     58     mtxworld.appendRotation(degreX/1,Vector3D.X_AXIS);//后置增量旋转
     59     mtxworld.appendRotation(degreY/1,Vector3D.Y_AXIS);
     60     mtxworld.appendRotation(degreZ/1,Vector3D.Z_AXIS);
     61     mtxworld.appendTranslation(TranslationX,TranslationY,TranslationZ);
     62     mtxworld.transformVectors(arr3D,new_arr3D);//new_arr3D获取旋转后的坐标以便得到Z值设置层深
     63     Utils3D.projectVectors(pm, new_arr3D, arr2D, uvt);
     64     var Z:Array=[];
     65     var tempInd:Vector.<int>=new Vector.<int>();//放置重新排列后的画三角形的顺序
     66     for (var k=0; k<vindicies.length; k+=3) {
     67         var ind:Vector.<int>=vindicies.slice(k,k+3);
     68         //vindicies数组中每三个元素一组,绘制成为一个三角形ind
     69         //该三角形ind得Z值为三个顶点的平均值;
     70         var d:Number=new_arr3D[ind[0]*3+2]+new_arr3D[ind[1]*3+2]+new_arr3D[ind[2]*3+2];
     71         Z.push({d:d,ind:ind});
     72     }
     73     Z.sortOn("d",Array.NUMERIC |Array.DESCENDING );//按数值降序排列,大的先绘制在里,小的后绘制在外
     74     for (i=0; i<Z.length; i++) {
     75         for (j=0; j<3; j++) {
     76             tempInd.push(Z[i].ind[j]);//重新排列所有三角形的顺序
     77         }
     78     }
     79     sp.graphics.clear();
     80     //sp.graphics.lineStyle(1,0xffffff);
     81     isFill?sp.graphics.beginBitmapFill(mypic,null,false):sp.graphics.lineStyle(1,0xffffff);
     82     sp.graphics.drawTriangles(arr2D,tempInd,uvt,TriangleCulling.POSITIVE);//
     83     //sp.graphics.beginBitmapFill(mypic,null,false);
     84     //sp.graphics.drawTriangles(arr2D,tempInd,uvt,TriangleCulling.NEGATIVE);//
     85 }
     86 
     87 
     88 
     89 
     90 function autoHandler(e:Event ):void {
     91     auto_btn.enabled=false;
     92     hand_btn.enabled=true;
     93     mov_btn.enabled=true;
     94     stage.addEventListener(Event.ENTER_FRAME, autoloopHandler);
     95     sp.removeEventListener(MouseEvent.MOUSE_DOWN, downHandler);
     96 
     97 }
     98 function handHandler(e:Event ):void {
     99     Rotation=true;
    100     auto_btn.enabled=true;
    101     hand_btn.enabled=false;
    102     mov_btn.enabled=true;
    103     stage.removeEventListener(Event.ENTER_FRAME, autoloopHandler);
    104     sp.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
    105 
    106 }
    107 function movHandler(e:Event ):void {
    108     Rotation=false;
    109     auto_btn.enabled=true;
    110     hand_btn.enabled=true;
    111     mov_btn.enabled=false;
    112     stage.removeEventListener(Event.ENTER_FRAME, autoloopHandler);
    113     sp.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
    114 
    115 }
    116 
    117 function autoloopHandler(e:Event ):void {
    118     render(imgselect.selected,Math.random ()*10,Math.random ()*10,Math.random ()*10);
    119 }
    120 function downHandler(e:Event ):void {
    121     Mouse.cursor=MouseCursor.HAND;
    122     _oldMousePoint.x=mouseX;
    123     _oldMousePoint.y=mouseY;
    124     stage.addEventListener(Event.ENTER_FRAME, loopHandler);
    125     stage.addEventListener(MouseEvent.MOUSE_UP, upHandler);
    126 }
    127 
    128 function loopHandler(e:Event ):void {
    129     if (Rotation) {
    130         render(imgselect.selected,mouseY-_oldMousePoint.y,-(mouseX-_oldMousePoint.x));
    131     } else {
    132         render(imgselect.selected,0,0,0,mouseX-_oldMousePoint.x,mouseY-_oldMousePoint.y,0);
    133     }
    134     _oldMousePoint.x=mouseX;
    135     _oldMousePoint.y=mouseY;
    136 }
    137 
    138 function upHandler(e:Event ):void {
    139     Mouse.cursor=MouseCursor.AUTO;
    140     stage.removeEventListener(Event.ENTER_FRAME, loopHandler);
    141 
    142 }
    143 imgselect.addEventListener(MouseEvent.CLICK, sliderDrag);
    144 i_slider.addEventListener(SliderEvent.THUMB_DRAG, sliderDrag);
    145 j_slider.addEventListener(SliderEvent.THUMB_DRAG, sliderDrag);
    146 r_slider.addEventListener(SliderEvent.THUMB_DRAG, sliderDrag);
    147 R_slider.addEventListener(SliderEvent.THUMB_DRAG, sliderDrag);
    148 function sliderDrag(e):void {//:SliderEvent
    149     init(R_slider.value,r_slider.value,i_slider.value,j_slider.value);
    150     i_txt.text=String(i_slider.value)
    151     j_txt.text=String(j_slider.value)
    152 
    153 }

    效果如下:----------------------------------------

  • 相关阅读:
    AndroidUI组件之ListView小技巧
    iframe属性參数
    Applet 数字签名技术全然攻略
    SoftReference
    递归算法浅谈
    VS2010 打包生成exe文件后 执行安装文件出现 TODO:&lt;文件说明&gt;已停止工作并已关闭
    创建新的Cocos2dx 3.0项目并解决一些编译问题
    ORACLE触发器具体解释
    SRM 624 D2L3: GameOfSegments, 博弈论,Sprague–Grundy theorem,Nimber
    cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
  • 原文地址:https://www.cnblogs.com/ddw1997/p/1530491.html
Copyright © 2011-2022 走看看