123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- /**
- * @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();
- var segment = thetaStart + o / thetaSegments * thetaLength;
- vertex.x = radius * Math.cos( segment );
- vertex.y = radius * Math.sin( segment );
- 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
- var thetaSegment = i * thetaSegments;
- for ( o = 0; o <= thetaSegments; o ++ ) { // number of segments per circle
- var segment = o + thetaSegment;
- var v1 = segment + i;
- var v2 = segment + thetaSegments + i;
- var v3 = segment + 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 = segment + i;
- v2 = segment + thetaSegments + 1 + i;
- v3 = segment + 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 );
|