root/as3/Astro/Torus3D_01/src/primitives/Torus.as

リビジョン 542, 2.8 kB (コミッタ: muta, コミット時期: 4 年 前)

シェーダ(Pixel Bender)を利用して 3D の頂点情報の計算を外部でするデモのお引っ越し。

Line 
1 package primitives
2 {
3     import flash.geom.Vector3D;
4    
5     public class Torus
6     {
7         public var vertices:Vector.<Vector3D>;
8         public var indices:Vector.<int>;
9         public var uvtData:Vector.<Number>;
10        
11         private var _innerRadius:Number;
12         private var _outerRadius:Number;
13         private var _sides:int;
14         private var _rings:int;
15        
16         public function Torus(
17             innerRadius:Number, outerRadius:Number, sides:int = 16, rings:int = 16):void
18         {
19             _innerRadius = innerRadius;
20             _outerRadius = outerRadius;
21             _sides = sides;
22             _rings = rings;
23            
24             build();
25         }
26        
27         /**
28          * @private
29          */
30         private function build():void
31         {
32             vertices = new Vector.<Vector3D>();
33             indices = new Vector.<int>();
34             uvtData = new Vector.<Number>();
35            
36             var i:int;
37             var j:int;
38            
39             var a:Number = 0;
40             var adda:Number = Math.PI * 2 / _sides;
41            
42             var b:Number = 0;
43             var addb:Number = Math.PI * 2 / _rings;
44            
45             for (i = 0; i < _sides; i++, a += adda)
46             {
47                 var ca:Number = Math.cos(a);
48                 var sa:Number = Math.sin(a);
49                
50                 var s:Number = sa * _innerRadius + _outerRadius;
51                 var z:Number = ca * _innerRadius;
52                
53                 for (j = 0; j < _rings; j++, b += addb)
54                 {
55                     var cb:Number = Math.cos(b);
56                     var sb:Number = Math.sin(b);
57                    
58                     vertices.push(new Vector3D(cb * s, sb * s, z));
59                     uvtData.push(cb * (sa + 0.8) / 2 + 0.5, -sb * (sa + 0.8) / 2 + 0.5);
60                 }
61             }
62            
63             var n:int = _sides * _rings;
64            
65             for (i = 0; i < _sides; i++)
66             {
67                 var off:Number = i * _rings;
68                
69                 for (j = 0; j < _rings; j++)
70                 {
71                     var n1:int = int((off + _rings) % n + (j + 1) % _rings);
72                     var n2:int = int( off               + (j + 1) % _rings);
73                     var n3:int = int( off               +  j              );
74                     var n4:int = int((off + _rings) % n +  j              );
75                    
76                     indices.push(n1, n2, n3,  n1, n3, n4);
77                 }
78             }
79         }
80        
81         public function get numPartitions():int
82         {
83             return _sides;
84         }
85        
86         public function set numPartitions(value:int):void
87         {
88             _sides = value;
89             _rings = value;
90            
91             build();
92         }
93     }
94 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。