※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : jidolstar's 3D Example, Flash Player 10 : flash on 2009-7-2 [diff(1)]

FORKED
  1. // forked from csmoak's forked from: 3D Example, Flash Player 10 : flash on 2009-7-2
  2. // forked from jidolstar's 3D Example, Flash Player 10 : flash on 2009-7-2
  3. package
  4. {
  5.     import flash.display.Bitmap;
  6.     import flash.display.BitmapData;
  7.     import flash.display.GraphicsTrianglePath;
  8.     import flash.display.Shape;
  9.     import flash.display.Sprite;
  10.     import flash.display.StageAlign;
  11.     import flash.display.StageQuality;
  12.     import flash.display.StageScaleMode;
  13.     import flash.events.Event;
  14.     import flash.events.KeyboardEvent;
  15.     import flash.events.MouseEvent;
  16.     import flash.geom.Matrix3D;
  17.     import flash.geom.PerspectiveProjection;
  18.     import flash.geom.Utils3D;
  19.     import flash.geom.Vector3D;
  20.     import flash.utils.getTimer;
  21.     import flash.text.TextField;
  22.         import flash.text.TextFieldAutoSize;
  23.     
  24.     [SWF(frameRate=60, backgroundColor=0x000000)]
  25.     
  26.     /**
  27.      * 3D Texture 예제.
  28.      * @author Yongho, Ji
  29.      * @since 2009.07.01
  30.      * @see http://help.adobe.com/ko_KR/ActionScript/3.0_ProgrammingAS3/WSF24A5A75-38D6-4a44-BDC6-927A2B123E90.html
  31.      */ 
  32.     public class Texture3D extends Sprite
  33.     {
  34.         // 투영된  Vertex 정보 
  35.         private var projected:Vector.<Number>;
  36.         // 투영
  37.         private var projection:PerspectiveProjection = new PerspectiveProjection();
  38.         
  39.         // World 변환 행렬 
  40.         private var world:Matrix3D = new Matrix3D();
  41.         
  42.         // Viewport (3D 렌더링 대상)
  43.         private var viewport:Shape = new Shape();
  44.         
  45.         // Mesh 데이터 
  46.         private var mesh:GraphicsTrianglePath
  47.         
  48.         // Texture
  49.         private var texture:BitmapData = new BitmapData(512512false);
  50.         
  51.         //triangle을 보여줄지 여부  
  52.         private var visibleTriangle:Boolean = false;
  53.         
  54.         //Texture를 보여줄지 여부 
  55.         private var visibleTexture:Boolean = true;
  56.         
  57.         //실린더  Mesh번호 
  58.         private const MESH_CYLINDER:int = 1;
  59.         
  60.         //원형체  Mesh번호  
  61.         private const MESH_TORUS:int = 2;
  62.         
  63.         //구 Mesh 번호 
  64.         private const MESH_SPHERE:int = 3;
  65.         
  66.         //선택한 Mesh 번호 
  67.         private var selectedMesh:int;
  68.         
  69.         //Viewport의 Z축 위치 
  70.         private var viewPortZAxis:Number = 300;
  71.         
  72.         /**
  73.          * 생성자 
  74.          */ 
  75.         public function Texture3D()
  76.         {
  77.             super();
  78.             
  79.             //화면 설정 
  80.             stage.align = StageAlign.TOP_LEFT;
  81.             stage.scaleMode = StageScaleMode.NO_SCALE;
  82.             stage.quality = StageQuality.BEST;
  83.                         //텍스쳐 입히기 
  84.                         texture.perlinNoise(646430truetrue7true);
  85.             
  86.             //viewport를 화면의 중심으로 
  87.             viewport.x = stage.stageWidth/2;
  88.             viewport.y = stage.stageHeight/2;
  89.             addChild(viewport);
  90.             
  91.             //projection의 fieldOfView를  60으로 지정 
  92.             projection.fieldOfView = 60;
  93.             
  94.             //mesh 데이터 설정 
  95.             selectMesh( MESH_CYLINDER );
  96.             
  97.             //이벤트 처리                             
  98.             stage.addEventListener( Event.RESIZE, onResize );
  99.             addEventListener( Event.ENTER_FRAME, onEnterFrame );
  100.             stage.addEventListener( MouseEvent.CLICK, onMouseClick );
  101.             stage.addEventListener( KeyboardEvent.KEY_DOWN, onKey );
  102.             stage.addEventListener( MouseEvent.MOUSE_WHEEL, onMouseWheel );
  103.              var textField:TextField = new TextField();
  104.             textField.multiline = true;
  105.             textField.textColor = 0xffffff;
  106.             textField.htmlText = "Change Shape : Key 1~3 <br>Show Texture : Key T<br>Show Triangle : Mouse Click<br>Zoom In/Out : Mouse Wheel";
  107.             textField.autoSize = TextFieldAutoSize.LEFT;
  108.             addChild( textField ); 
  109.  
  110.         }
  111.         
  112.         /**
  113.          * Mesh를 선택한다.
  114.          */ 
  115.         private function selectMesh( meshNumber:int ):void
  116.         {
  117.             if( selectedMesh == meshNumber ) return;
  118.             selectedMesh = meshNumber;
  119.             
  120.             //투영결과 Vertex 데이타를 초기화시킨다. 
  121.             //이것을 해야 Mesh데이터가 바뀔때마다 drawTriangle에서 에러 발생 안함 
  122.             projected  = new Vector.<Number>(0false);
  123.             switch( selectedMesh )
  124.             {
  125.                 //실린더 
  126.                 case MESH_CYLINDER:
  127.                     mesh = createCylinderMesh( 50100205 );
  128.                     break;
  129.                 //원형체 
  130.                 case MESH_TORUS:
  131.                     mesh = createTorusMesh( 50253216 );
  132.                     break;
  133.                 //구 
  134.                 case MESH_SPHERE:
  135.                     mesh = createSphereMesh( 503232 );
  136.                     break;
  137.             }            
  138.         }
  139.         
  140.         /**
  141.          * 사이즈 변경시 처리  
  142.          */ 
  143.         private function onResize( event:Event ):void
  144.         {
  145.             //viewport는 항상 화면의 중심에 위치하도록 처리 
  146.             viewport.x = stage.stageWidth/2;
  147.             viewport.y = stage.stageHeight/2;    
  148.         }
  149.         
  150.         /**
  151.          * 프레임 마다 처리. 
  152.          */ 
  153.         private function onEnterFrame( event:Event ):void
  154.         {
  155.             world.identity(); //단위행렬로 전환 
  156.             world.appendRotation( getTimer() * 0.027, Vector3D.X_AXIS ); //X축 회전
  157.             world.appendRotation( getTimer() * 0.061, Vector3D.Y_AXIS ); //Y축 회전 
  158.             world.appendTranslation(00, viewPortZAxis); //이동 
  159.             world.append(projection.toMatrix3D()); //투영 변환 적용 
  160.             
  161.             // mesh 데이터를  투영하여  projected 생성 
  162.             // uvtData도 갱신된다. 갱신되는 데이터는 T값이다. 
  163.             Utils3D.projectVectors( world, mesh.vertices, projected, mesh.uvtData );
  164.             
  165.             // texture를 이용해 렌더링
  166.             viewport.graphics.clear();
  167.             
  168.             // Triangle 라인을 그림 
  169.             if( visibleTriangle )
  170.             {
  171.                 viewport.graphics.lineStyle( 1, 0xff0000, 1.0 );
  172.             }
  173.             
  174.             //Texture 입힌다.
  175.             if( visibleTexture )
  176.             {
  177.                 viewport.graphics.beginBitmapFill( texture, nullfalsetrue );
  178.                 viewport.graphics.drawTriangles( projected, getSortedIndices(mesh), mesh.uvtData, mesh.culling );                
  179.             }
  180.             else
  181.             {
  182.                 viewport.graphics.beginFill( 0x00ccff, 1.0 );
  183.                 viewport.graphics.drawTriangles( projected, getSortedIndices(mesh), null, mesh.culling );                
  184.                 viewport.graphics.endFill();            
  185.             }
  186.         }
  187.         
  188.         /**
  189.          * 마우스 클릭 처리 
  190.          */ 
  191.         private function onMouseClick( event:MouseEvent ):void
  192.         {
  193.             //삼각형  선 Visible 바꿈 
  194.             visibleTriangle = !visibleTriangle;    
  195.         }
  196.         
  197.         /**
  198.          * 키보드 이벤츠 처리  
  199.          */ 
  200.         private function onKey( event:KeyboardEvent ):void
  201.         {
  202.             if( event.charCode == 116 )
  203.             {
  204.                 visibleTexture = !visibleTexture;    
  205.             }
  206.             else
  207.             {
  208.                 selectMesh( event.charCode - 48 ); //1,2...
  209.             }
  210.         }
  211.         
  212.         /**
  213.          * 마우스 휠 처리 
  214.          */ 
  215.         private function onMouseWheel( event:MouseEvent ):void
  216.         {
  217.             viewPortZAxis += event.delta * 10;
  218.         }
  219.     }
  220. }
  221. import flash.display.GraphicsTrianglePath;
  222. import flash.display.TriangleCulling;
  223. /**
  224.  * GraphicsTrianglePath를 기반으로, Z축으로 sort된 인덱스를 돌려준다.
  225.  * 이 작업을 해주어야 z축 깊이에 따라 Triangle이 제대로 그려진다. 
  226.  * @param mesh 정보 
  227.  * @return sort된 index 데이터 
  228.  */
  229. function getSortedIndices( mesh:GraphicsTrianglePath ):Vector.<int
  230. {
  231.     var triangles:Array = [];
  232.     var length:uint = mesh.indices.length;
  233.     
  234.     //z축 sort를 위한 기반 제작 
  235.     for ( var i:uint=0; i < length; i += 3 ) 
  236.     {
  237.         var i1:uint = mesh.indices[ i+0 ];
  238.         var i2:uint = mesh.indices[ i+1 ];
  239.         var i3:uint = mesh.indices[ i+2 ];
  240.         var z:Number = Math.min( mesh.uvtData[i1 * 3 + 2], mesh.uvtData[i2 * 3 + 2], mesh.uvtData[i3 * 3 + 2]);
  241.         if (z > 0
  242.         { 
  243.             triangles.push({i1:i1, i2:i2, i3:i3, z:z}); 
  244.         }
  245.     }
  246.     
  247.     //z축으로 sort
  248.     triangles = triangles.sortOn("z"Array.NUMERIC);
  249.     
  250.     //sort된 값을 이용해 Vector값 만듬 
  251.     var sortedIndices:Vector.<int> = new Vector.<int>(0false);
  252.     for each (var triangle:Object in triangles) 
  253.     {
  254.         sortedIndices.push(triangle.i1, triangle.i2, triangle.i3);
  255.     }
  256.     return sortedIndices;
  257. }
  258. /**
  259.  * 원통모양의 Mesh 데이터 작성 
  260.  * @param radius 원통의 반지름
  261.  * @param height 원통의 높이 
  262.  * @param hDiv 반지름 방향으로 조각 수 
  263.  * @param vDiv 높이 방향의 조각수 
  264.  * @return mesh 데이터 
  265.  */ 
  266. function createCylinderMesh( radius:Number, height:Number, hDiv:uint, vDiv:uint ):GraphicsTrianglePath
  267. {
  268.     var vertices:Vector.<Number> = new Vector.<Number>( 0false );
  269.     var indices:Vector.<int> = new Vector.<int>( 0false );
  270.     var uvtData:Vector.<Number> = new Vector.<Number>( 0false );
  271.     var mesh:GraphicsTrianglePath = new GraphicsTrianglePath( vertices, indices, uvtData, TriangleCulling.NONE );
  272.     
  273.     forvar i:uint = 0; i <= hDiv; i++ )
  274.     {
  275.         var theta:Number = Math.PI * 2 * i / hDiv; //z축에서 y축으로 잰각 
  276.         forvar j:uint = 0; j <= vDiv; j++ )
  277.         {
  278.             var x:Number = -height/2 + j * height/vDiv;
  279.             var y:Number = radius * Math.sin( theta );
  280.             var z:Number = radius * Math.cos( theta );
  281.             mesh.vertices.push( x, y, z );                //하나의 Vertex 데이타 
  282.             mesh.uvtData.push( i / hDiv, j / vDiv, 1 ); //하나의 UVT 데이타 . Texture의 점과 Vectex를 일치시켜 Texture를 입히기 위한 데이타이다.
  283.             if( j < vDiv && i < hDiv )
  284.             {
  285.                 var a:uint =  i      * (vDiv + 1) + j;
  286.                 var b:uint = (i + 1) * (vDiv + 1) + j;
  287.                 mesh.indices.push(a, a + 1, b, b + 1, b, a + 1); //삼각형의 index이다. culling방향 고려 
  288.             } 
  289.         }
  290.     }
  291.     return mesh;
  292. }
  293. /**
  294.  * 원환체(도너츠모양) Mesh 데이터 작성 
  295.  * @param hRadius 원환체의 수평축 반지름
  296.  * @param vRadius 원환체의 수직축 반지름  
  297.  * @param hDiv 수평 방향의 조각 수 
  298.  * @param vDiv 높이 방향의 조각수 
  299.  * @return mesh 데이터 
  300.  */
  301. function createTorusMesh( hRadius:Number, vRadius:Number, hDiv:uint, vDiv:uint ):GraphicsTrianglePath 
  302. {
  303.     var vertices:Vector.<Number> = new Vector.<Number>( 0false );
  304.     var indices:Vector.<int> = new Vector.<int>( 0false );
  305.     var uvtData:Vector.<Number> = new Vector.<Number>( 0false );
  306.     var mesh:GraphicsTrianglePath = new GraphicsTrianglePath( vertices, indices, uvtData, TriangleCulling.NONE );
  307.     for (var i:uint=0; i<=hDiv; i++) 
  308.     {
  309.         var s1:Number = Math.PI * 2 * i / hDiv;
  310.         for (var j:uint=0; j<=vDiv; j++) 
  311.         {
  312.             var s2:Number = Math.PI * 2 * j / vDiv;
  313.             var r:Number = Math.cos(s2) * vRadius + hRadius;
  314.             var x:Number = Math.cos(s1) * r;
  315.             var y:Number = Math.sin(s1) * r;
  316.             var z:Number = Math.sin(s2) * vRadius;            
  317.             mesh.vertices.push( x, y, z );    
  318.             mesh.uvtData.push(i / hDiv, j / vDiv, 1);
  319.             if (j < vDiv && i < hDiv) {
  320.                 var a:uint =  i      * (vDiv + 1) + j;
  321.                 var b:uint = (i + 1) * (vDiv + 1) + j;
  322.                 mesh.indices.push(b, a + 1, a, a + 1, b, b + 1);
  323.             }
  324.         }
  325.     }
  326.     return mesh;
  327. }
  328. /**
  329.  * 구 Mesh 데이터 작성 
  330.  * @param radius 구의 반지름  
  331.  * @param hDiv 수평 방향의 조각 수 
  332.  * @param vDiv 높이 방향의 조각수 
  333.  * @return mesh 데이터 
  334.  */
  335. function createSphereMesh( radius:Number, hDiv:uint, vDiv:uint ):GraphicsTrianglePath
  336. {
  337.     var vertices:Vector.<Number> = new Vector.<Number>( 0false );
  338.     var indices:Vector.<int> = new Vector.<int>( 0false );
  339.     var uvtData:Vector.<Number> = new Vector.<Number>( 0false );
  340.     var mesh:GraphicsTrianglePath = new GraphicsTrianglePath( vertices, indices, uvtData, TriangleCulling.POSITIVE );
  341.     
  342.     forvar i:uint = 0; i <= hDiv; i++ )
  343.     {
  344.         var s1:Number = Math.PI * 2 * i / hDiv;
  345.         forvar j:uint = 0; j <= vDiv; j++ )
  346.         {
  347.             var s2:Number = Math.PI * 2 * j / vDiv;
  348.             var cos1:Number = Math.cos( s1 );
  349.             var sin1:Number = Math.sin( s1 );
  350.             var cos2:Number = Math.cos( s2 );
  351.             var sin2:Number = Math.sin( s2 ); 
  352.             var x:Number = radius * cos2 * cos1;
  353.             var y:Number = radius * cos2 * sin1;
  354.             var z:Number = radius * sin2;              
  355.             mesh.vertices.push( x, y, z );     
  356.             mesh.uvtData.push( i / hDiv, j / vDiv, 1 );
  357.             if( j < vDiv && i < hDiv )
  358.             {
  359.                 var a:uint =  i      * (vDiv + 1) + j;
  360.                 var b:uint = (i + 1) * (vDiv + 1) + j;
  361.                 mesh.indices.push(a, a + 1, b, b + 1, b, a + 1); 
  362.             } 
  363.         }
  364.     }    
  365.     
  366.     return mesh;
  367. }
noswf
  1. // forked from csmoak's forked from: 3D Example, Flash Player 10 : flash on 2009-7-2
  2. // forked from jidolstar's 3D Example, Flash Player 10 : flash on 2009-7-2
  3. package
  4. {
  5.     import flash.display.Bitmap;
  6.     import flash.display.BitmapData;
  7.     import flash.display.GraphicsTrianglePath;
  8.     import flash.display.Shape;
  9.     import flash.display.Sprite;
  10.     import flash.display.StageAlign;
  11.     import flash.display.StageQuality;
  12.     import flash.display.StageScaleMode;
  13.     import flash.events.Event;
  14.     import flash.events.KeyboardEvent;
  15.     import flash.events.MouseEvent;
  16.     import flash.geom.Matrix3D;
  17.     import flash.geom.PerspectiveProjection;
  18.     import flash.geom.Utils3D;
  19.     import flash.geom.Vector3D;
  20.     import flash.utils.getTimer;
  21.     import flash.text.TextField;
  22.         import flash.text.TextFieldAutoSize;
  23.     
  24.     [SWF(frameRate=60, backgroundColor=0x000000)]
  25.     
  26.     /**
  27.      * 3D Texture 예제.
  28.      * @author Yongho, Ji
  29.      * @since 2009.07.01
  30.      * @see http://help.adobe.com/ko_KR/ActionScript/3.0_ProgrammingAS3/WSF24A5A75-38D6-4a44-BDC6-927A2B123E90.html
  31.      */ 
  32.     public class Texture3D extends Sprite
  33.     {
  34.         // 투영된  Vertex 정보 
  35.         private var projected:Vector.<Number>;
  36.         // 투영
  37.         private var projection:PerspectiveProjection = new PerspectiveProjection();
  38.         
  39.         // World 변환 행렬 
  40.         private var world:Matrix3D = new Matrix3D();
  41.         
  42.         // Viewport (3D 렌더링 대상)
  43.         private var viewport:Shape = new Shape();
  44.         
  45.         // Mesh 데이터 
  46.         private var mesh:GraphicsTrianglePath
  47.         
  48.         // Texture
  49.         private var texture:BitmapData = new BitmapData(512512false);
  50.         
  51.         //triangle을 보여줄지 여부  
  52.         private var visibleTriangle:Boolean = false;
  53.         
  54.         //Texture를 보여줄지 여부 
  55.         private var visibleTexture:Boolean = true;
  56.         
  57.         //실린더  Mesh번호 
  58.         private const MESH_CYLINDER:int = 1;
  59.         
  60.         //원형체  Mesh번호  
  61.         private const MESH_TORUS:int = 2;
  62.         
  63.         //구 Mesh 번호 
  64.         private const MESH_SPHERE:int = 3;
  65.         
  66.         //선택한 Mesh 번호 
  67.         private var selectedMesh:int;
  68.         
  69.         //Viewport의 Z축 위치 
  70.         private var viewPortZAxis:Number = 300;
  71.         
  72.         /**
  73.          * 생성자 
  74.          */ 
  75.         public function Texture3D()
  76.         {
  77.             super();
  78.             
  79.             //화면 설정 
  80.             stage.align = StageAlign.TOP_LEFT;
  81.             stage.scaleMode = StageScaleMode.NO_SCALE;
  82.             stage.quality = StageQuality.BEST;
  83.                         //텍스쳐 입히기 
  84.                         texture.perlinNoise(646430truetrue7true);
  85.             
  86.             //viewport를 화면의 중심으로 
  87.             viewport.x = stage.stageWidth/2;
  88.             viewport.y = stage.stageHeight/2;
  89.             addChild(viewport);
  90.             
  91.             //projection의 fieldOfView를  60으로 지정 
  92.             projection.fieldOfView = 60;
  93.             
  94.             //mesh 데이터 설정 
  95.             selectMesh( MESH_CYLINDER );
  96.             
  97.             //이벤트 처리                             
  98.             stage.addEventListener( Event.RESIZE, onResize );
  99.             addEventListener( Event.ENTER_FRAME, onEnterFrame );
  100.             stage.addEventListener( MouseEvent.CLICK, onMouseClick );
  101.             stage.addEventListener( KeyboardEvent.KEY_DOWN, onKey );
  102.             stage.addEventListener( MouseEvent.MOUSE_WHEEL, onMouseWheel );
  103.              var textField:TextField = new TextField();
  104.             textField.multiline = true;
  105.             textField.textColor = 0xffffff;
  106.             textField.htmlText = "Change Shape : Key 1~3 <br>Show Texture : Key T<br>Show Triangle : Mouse Click<br>Zoom In/Out : Mouse Wheel";
  107.             textField.autoSize = TextFieldAutoSize.LEFT;
  108.             addChild( textField ); 
  109.  
  110.         }
  111.         
  112.         /**
  113.          * Mesh를 선택한다.
  114.          */ 
  115.         private function selectMesh( meshNumber:int ):void
  116.         {
  117.             if( selectedMesh == meshNumber ) return;
  118.             selectedMesh = meshNumber;
  119.             
  120.             //투영결과 Vertex 데이타를 초기화시킨다. 
  121.             //이것을 해야 Mesh데이터가 바뀔때마다 drawTriangle에서 에러 발생 안함 
  122.             projected  = new Vector.<Number>(0false);
  123.             switch( selectedMesh )
  124.             {
  125.                 //실린더 
  126.                 case MESH_CYLINDER:
  127.                     mesh = createCylinderMesh( 50100205 );
  128.                     break;
  129.                 //원형체 
  130.                 case MESH_TORUS:
  131.                     mesh = createTorusMesh( 50253216 );
  132.                     break;
  133.                 //구 
  134.                 case MESH_SPHERE:
  135.                     mesh = createSphereMesh( 503232 );
  136.                     break;
  137.             }            
  138.         }
  139.         
  140.         /**
  141.          * 사이즈 변경시 처리  
  142.          */ 
  143.         private function onResize( event:Event ):void
  144.         {
  145.             //viewport는 항상 화면의 중심에 위치하도록 처리 
  146.             viewport.x = stage.stageWidth/2;
  147.             viewport.y = stage.stageHeight/2;    
  148.         }
  149.         
  150.         /**
  151.          * 프레임 마다 처리. 
  152.          */ 
  153.         private function onEnterFrame( event:Event ):void
  154.         {
  155.             world.identity(); //단위행렬로 전환 
  156.             world.appendRotation( getTimer() * 0.027, Vector3D.X_AXIS ); //X축 회전
  157.             world.appendRotation( getTimer() * 0.061, Vector3D.Y_AXIS ); //Y축 회전 
  158.             world.appendTranslation(00, viewPortZAxis); //이동 
  159.             world.append(projection.toMatrix3D()); //투영 변환 적용 
  160.             
  161.             // mesh 데이터를  투영하여  projected 생성 
  162.             // uvtData도 갱신된다. 갱신되는 데이터는 T값이다. 
  163.             Utils3D.projectVectors( world, mesh.vertices, projected, mesh.uvtData );
  164.             
  165.             // texture를 이용해 렌더링
  166.             viewport.graphics.clear();
  167.             
  168.             // Triangle 라인을 그림 
  169.             if( visibleTriangle )
  170.             {
  171.                 viewport.graphics.lineStyle( 1, 0xff0000, 1.0 );
  172.             }
  173.             
  174.             //Texture 입힌다.
  175.             if( visibleTexture )
  176.             {
  177.                 viewport.graphics.beginBitmapFill( texture, nullfalsetrue );
  178.                 viewport.graphics.drawTriangles( projected, getSortedIndices(mesh), mesh.uvtData, mesh.culling );                
  179.             }
  180.             else
  181.             {
  182.                 viewport.graphics.beginFill( 0x00ccff, 1.0 );
  183.                 viewport.graphics.drawTriangles( projected, getSortedIndices(mesh), null, mesh.culling );                
  184.                 viewport.graphics.endFill();            
  185.             }
  186.         }
  187.         
  188.         /**
  189.          * 마우스 클릭 처리 
  190.          */ 
  191.         private function onMouseClick( event:MouseEvent ):void
  192.         {
  193.             //삼각형  선 Visible 바꿈 
  194.             visibleTriangle = !visibleTriangle;    
  195.         }
  196.         
  197.         /**
  198.          * 키보드 이벤츠 처리  
  199.          */ 
  200.         private function onKey( event:KeyboardEvent ):void
  201.         {
  202.             if( event.charCode == 116 )
  203.             {
  204.                 visibleTexture = !visibleTexture;    
  205.             }
  206.             else
  207.             {
  208.                 selectMesh( event.charCode - 48 ); //1,2...
  209.             }
  210.         }
  211.         
  212.         /**
  213.          * 마우스 휠 처리 
  214.          */ 
  215.         private function onMouseWheel( event:MouseEvent ):void
  216.         {
  217.             viewPortZAxis += event.delta * 10;
  218.         }
  219.     }
  220. }
  221. import flash.display.GraphicsTrianglePath;
  222. import flash.display.TriangleCulling;
  223. /**
  224.  * GraphicsTrianglePath를 기반으로, Z축으로 sort된 인덱스를 돌려준다.
  225.  * 이 작업을 해주어야 z축 깊이에 따라 Triangle이 제대로 그려진다. 
  226.  * @param mesh 정보 
  227.  * @return sort된 index 데이터 
  228.  */
  229. function getSortedIndices( mesh:GraphicsTrianglePath ):Vector.<int
  230. {
  231.     var triangles:Array = [];
  232.     var length:uint = mesh.indices.length;
  233.     
  234.     //z축 sort를 위한 기반 제작 
  235.     for ( var i:uint=0; i < length; i += 3 ) 
  236.     {
  237.         var i1:uint = mesh.indices[ i+0 ];
  238.         var i2:uint = mesh.indices[ i+1 ];
  239.         var i3:uint = mesh.indices[ i+2 ];
  240.         var z:Number = Math.min( mesh.uvtData[i1 * 3 + 2], mesh.uvtData[i2 * 3 + 2], mesh.uvtData[i3 * 3 + 2]);
  241.         if (z > 0
  242.         { 
  243.             triangles.push({i1:i1, i2:i2, i3:i3, z:z}); 
  244.         }
  245.     }
  246.     
  247.     //z축으로 sort
  248.     triangles = triangles.sortOn("z"Array.NUMERIC);
  249.     
  250.     //sort된 값을 이용해 Vector값 만듬 
  251.     var sortedIndices:Vector.<int> = new Vector.<int>(0false);
  252.     for each (var triangle:Object in triangles) 
  253.     {
  254.         sortedIndices.push(triangle.i1, triangle.i2, triangle.i3);
  255.     }
  256.     return sortedIndices;
  257. }
  258. /**
  259.  * 원통모양의 Mesh 데이터 작성 
  260.  * @param radius 원통의 반지름
  261.  * @param height 원통의 높이 
  262.  * @param hDiv 반지름 방향으로 조각 수 
  263.  * @param vDiv 높이 방향의 조각수 
  264.  * @return mesh 데이터 
  265.  */ 
  266. function createCylinderMesh( radius:Number, height:Number, hDiv:uint, vDiv:uint ):GraphicsTrianglePath
  267. {
  268.     var vertices:Vector.<Number> = new Vector.<Number>( 0false );
  269.     var indices:Vector.<int> = new Vector.<int>( 0false );
  270.     var uvtData:Vector.<Number> = new Vector.<Number>( 0false );
  271.     var mesh:GraphicsTrianglePath = new GraphicsTrianglePath( vertices, indices, uvtData, TriangleCulling.NONE );
  272.     
  273.     forvar i:uint = 0; i <= hDiv; i++ )
  274.     {
  275.         var theta:Number = Math.PI * 2 * i / hDiv; //z축에서 y축으로 잰각 
  276.         forvar j:uint = 0; j <= vDiv; j++ )
  277.         {
  278.             var x:Number = -height/2 + j * height/vDiv;
  279.             var y:Number = radius * Math.sin( theta );
  280.             var z:Number = radius * Math.cos( theta );
  281.             mesh.vertices.push( x, y, z );                //하나의 Vertex 데이타 
  282.             mesh.uvtData.push( i / hDiv, j / vDiv, 1 ); //하나의 UVT 데이타 . Texture의 점과 Vectex를 일치시켜 Texture를 입히기 위한 데이타이다.
  283.             if( j < vDiv && i < hDiv )
  284.             {
  285.                 var a:uint =  i      * (vDiv + 1) + j;
  286.                 var b:uint = (i + 1) * (vDiv + 1) + j;
  287.                 mesh.indices.push(a, a + 1, b, b + 1, b, a + 1); //삼각형의 index이다. culling방향 고려 
  288.             } 
  289.         }
  290.     }
  291.     return mesh;
  292. }
  293. /**
  294.  * 원환체(도너츠모양) Mesh 데이터 작성 
  295.  * @param hRadius 원환체의 수평축 반지름
  296.  * @param vRadius 원환체의 수직축 반지름  
  297.  * @param hDiv 수평 방향의 조각 수 
  298.  * @param vDiv 높이 방향의 조각수 
  299.  * @return mesh 데이터 
  300.  */
  301. function createTorusMesh( hRadius:Number, vRadius:Number, hDiv:uint, vDiv:uint ):GraphicsTrianglePath 
  302. {
  303.     var vertices:Vector.<Number> = new Vector.<Number>( 0false );
  304.     var indices:Vector.<int> = new Vector.<int>( 0false );
  305.     var uvtData:Vector.<Number> = new Vector.<Number>( 0false );
  306.     var mesh:GraphicsTrianglePath = new GraphicsTrianglePath( vertices, indices, uvtData, TriangleCulling.NONE );
  307.     for (var i:uint=0; i<=hDiv; i++) 
  308.     {
  309.         var s1:Number = Math.PI * 2 * i / hDiv;
  310.         for (var j:uint=0; j<=vDiv; j++) 
  311.         {
  312.             var s2:Number = Math.PI * 2 * j / vDiv;
  313.             var r:Number = Math.cos(s2) * vRadius + hRadius;
  314.             var x:Number = Math.cos(s1) * r;
  315.             var y:Number = Math.sin(s1) * r;
  316.             var z:Number = Math.sin(s2) * vRadius;            
  317.             mesh.vertices.push( x, y, z );    
  318.             mesh.uvtData.push(i / hDiv, j / vDiv, 1);
  319.             if (j < vDiv && i < hDiv) {
  320.                 var a:uint =  i      * (vDiv + 1) + j;
  321.                 var b:uint = (i + 1) * (vDiv + 1) + j;
  322.                 mesh.indices.push(b, a + 1, a, a + 1, b, b + 1);
  323.             }
  324.         }
  325.     }
  326.     return mesh;
  327. }
  328. /**
  329.  * 구 Mesh 데이터 작성 
  330.  * @param radius 구의 반지름  
  331.  * @param hDiv 수평 방향의 조각 수 
  332.  * @param vDiv 높이 방향의 조각수 
  333.  * @return mesh 데이터 
  334.  */
  335. function createSphereMesh( radius:Number, hDiv:uint, vDiv:uint ):GraphicsTrianglePath
  336. {
  337.     var vertices:Vector.<Number> = new Vector.<Number>( 0false );
  338.     var indices:Vector.<int> = new Vector.<int>( 0false );
  339.     var uvtData:Vector.<Number> = new Vector.<Number>( 0false );
  340.     var mesh:GraphicsTrianglePath = new GraphicsTrianglePath( vertices, indices, uvtData, TriangleCulling.POSITIVE );
  341.     
  342.     forvar i:uint = 0; i <= hDiv; i++ )
  343.     {
  344.         var s1:Number = Math.PI * 2 * i / hDiv;
  345.         forvar j:uint = 0; j <= vDiv; j++ )
  346.         {
  347.             var s2:Number = Math.PI * 2 * j / vDiv;
  348.             var cos1:Number = Math.cos( s1 );
  349.             var sin1:Number = Math.sin( s1 );
  350.             var cos2:Number = Math.cos( s2 );
  351.             var sin2:Number = Math.sin( s2 ); 
  352.             var x:Number = radius * cos2 * cos1;
  353.             var y:Number = radius * cos2 * sin1;
  354.             var z:Number = radius * sin2;              
  355.             mesh.vertices.push( x, y, z );     
  356.             mesh.uvtData.push( i / hDiv, j / vDiv, 1 );
  357.             if( j < vDiv && i < hDiv )
  358.             {
  359.                 var a:uint =  i      * (vDiv + 1) + j;
  360.                 var b:uint = (i + 1) * (vDiv + 1) + j;
  361.                 mesh.indices.push(a, a + 1, b, b + 1, b, a + 1); 
  362.             } 
  363.         }
  364.     }    
  365.     
  366.     return mesh;
  367. }
noswf
Get Adobe Flash Player