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


embed

FORKED

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

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

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

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

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

  1. package {
  2. import flash.display.Sprite;
  3. import flash.text.TextField;
  4. import flash.text.TextFormat;
  5. import flash.text.engine.*;
  6.  
  7. public class TextTest extends Sprite {
  8.  
  9. public function TextTest () {
  10.  
  11. for (var i:int = 0; i <= 20; i++) {
  12.     var txt:TextField = new TextField();
  13.     txt.selectable = false;
  14.     txt.width = 300;
  15.     txt.height = 100;
  16.     txt.text = "Hello world!";
  17.     txt.setTextFormat(new TextFormat("Georgia"2 + 2*i));
  18.  
  19.     txt.x = 6*(i*(i+1)/2);
  20.     txt.y = 30;
  21.     txt.rotationZ = 20;
  22.     addChild(txt);
  23. }
  24.  
  25. for (var j:int=0; j<=20; j++) {
  26.     trace(j);
  27.     var myString:String = "Hello world!";
  28.     var myFormat:ElementFormat = new ElementFormat();
  29.  
  30.     var myFontDesc:FontDescription = new FontDescription("Georgia");
  31.     myFormat.fontSize = 2 + 2*j;
  32.     myFormat.fontDescription = myFontDesc; 
  33.  
  34.     var textElement:TextElement = new TextElement(myString, myFormat);
  35.     var textBlock:TextBlock = new TextBlock();
  36.     textBlock.content = textElement; 
  37.  
  38.     var myTextLine:TextLine = textBlock.createTextLine(null300); 
  39.  
  40.     myTextLine.x = 6*(j*(j+1)/2);
  41.     myTextLine.y = 150;
  42.     myTextLine.rotation = 20;
  43.  
  44.     addChild(myTextLine);
  45. }
  46.  
  47.   }
  48.  }
  49. }
noswf

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

  1. package
  2. {
  3.     import flash.display.*;
  4.     import flash.filters.DisplacementMapFilter;
  5.     import flash.filters.DisplacementMapFilterMode;
  6.     import flash.text.*;
  7.     import flash.geom.*
  8.     
  9.     public class WaveFilter extends Sprite
  10.     {
  11.         public function WaveFilter(bmp:Bitmap)
  12.         {
  13.             var bmpData=bmp.bitmapData;
  14.             var f=new DisplacementMapFilter(new BitmapData(bmpData.width,bmpData.height) ,new Point(0,0), BitmapDataChannel.RED, BitmapDataChannel.BLUE, 200200, DisplacementMapFilterMode.IGNORE);
  15.  
  16.             var field=txtField();
  17.             var mtrx=new Matrix(1,0,0,1,100,100);
  18.             f.mapBitmap.draw(field,mtrx);
  19.             bmp.filters=[f];
  20.         }
  21.  
  22.         private function txtField():TextField
  23.         {
  24.             var field=new TextField();
  25.             field.text="kuku";
  26.             var format=new TextFormat();
  27.             format.size=300;
  28.             format.color=0x000000;
  29.             format.bold=true;
  30.             field.setTextFormat(format);
  31.             field.autoSize="left";
  32.             field.x=101;
  33.             field.y=100;
  34.             return(field);
  35.         }
  36.     }
  37. }
noswf

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

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