浏览代码

Merge remote-tracking branch 'merpnderp/dev' into dev

Mr.doob 12 年之前
父节点
当前提交
af7fac3619
共有 1 个文件被更改,包括 73 次插入0 次删除
  1. 73 0
      src/extras/geometries/RingGeometry.js

+ 73 - 0
src/extras/geometries/RingGeometry.js

@@ -0,0 +1,73 @@
+/*
+ *
+ * Author: Kaleb Murphy
+ *
+ */
+
+
+
+THREE.RingGeometry = function ( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {
+
+    THREE.Geometry.call( this );
+
+    innerRadius = innerRadius || 0;
+    outerRadius = outerRadius || 50;
+
+    thetaStart = thetaStart !== undefined ? thetaStart : 0;
+    thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
+
+    thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;
+    phiSegments = phiSegments !== undefined ? Math.max( 3, phiSegments ) : 8;
+    
+    var i, o, uvs = [], radius = innerRadius, radiusStep = ( ( outerRadius - innerRadius ) / phiSegments);
+   
+    for( i = 0; i <= phiSegments; i++) {//concentric circles inside ring
+
+        for( o = 0; o <= thetaSegments; o++) {//number of segments per circle
+
+            var vertex = new THREE.Vector3();
+            
+            vertex.x = radius * Math.cos( thetaStart + o / thetaSegments * thetaLength );
+            vertex.y = radius * Math.sin( thetaStart + o / thetaSegments * thetaLength );
+            
+            this.vertices.push( vertex );
+            uvs.push( new THREE.Vector2( ( vertex.x / radius + 1 ) / 2, - ( vertex.y / radius + 1 ) / 2 + 1 ) );
+        }
+        
+        radius += radiusStep;
+
+    }
+
+    var n = new THREE.Vector3( 0, 0, 1 );
+    
+    for( i = 0; i < phiSegments; i++) {//concentric circles inside ring
+
+        for( o = 0; o <= thetaSegments; o++) {//number of segments per circle
+            
+            var v1, v2, v3;
+
+            v1 = o + (thetaSegments * i) + i;
+            v2 = o + (thetaSegments * i) + thetaSegments + i;
+            v3 = o + (thetaSegments * i) + thetaSegments + 1 + i;
+            
+            this.faces.push( new THREE.Face3( v1, v2, v3, [ n, n, n ] ) );
+            this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ], uvs[ v2 ], uvs[ v3 ] ]);
+            
+            v1 = o + (thetaSegments * i) + i;
+            v2 = o + (thetaSegments * i) + thetaSegments + 1 + i;
+            v3 = o + (thetaSegments * i) + 1 + i;
+            
+            this.faces.push( new THREE.Face3( v1, v2, v3, [ n, n, n ] ) );
+            this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ], uvs[ v2 ], uvs[ v3 ] ]);
+
+        }
+    }
+    
+    this.computeCentroids();
+    this.computeFaceNormals();
+
+    this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); 
+
+};
+
+THREE.RingGeometry.prototype = Object.create( THREE.Geometry.prototype );