From bc6273c255763bd15796f62754e2d4a2923f8eae Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Wed, 27 Feb 2013 06:24:06 +0000 Subject: [PATCH] Added new ring geometry. --- src/extras/geometries/RingGeometry.js | 97 +++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/extras/geometries/RingGeometry.js diff --git a/src/extras/geometries/RingGeometry.js b/src/extras/geometries/RingGeometry.js new file mode 100644 index 0000000000..9cf19e2161 --- /dev/null +++ b/src/extras/geometries/RingGeometry.js @@ -0,0 +1,97 @@ +/* + * + * 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 + + //Accounts for special case when inner radius is zero and we only have a single point in the first cirlce + if( innerRadius === 0 && i === 0 ) { + var vertex = new THREE.Vector3(); + this.vertices.push( vertex ); + uvs.push( new THREE.Vector2( ( vertex.x / radius + 1 ) / 2, - ( vertex.y / radius + 1 ) / 2 + 1 ) ); + radius += radiusStep; + continue; + } + + 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 ), mod = 0; + + 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; + + //Accounts for special case when inner radius is zero and we only have a single point in the first cirlce + if( innerRadius === 0 && i === 0 ) { + + v1 = 0; + v2 = o+1; + v3 = o+2; + this.faces.push( new THREE.Face3( v1, v2, v3, [ n, n, n ] ) ); + this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ], uvs[ v2 ], uvs[ v3 ] ]); + + }else if( innerRadius === 0 && i !== 0 ) { + + mod = -thetaSegments ; + + } + + v1 = o + (thetaSegments * i) + i + mod; + v3 = o + (thetaSegments * i) + thetaSegments + 1 + i + mod; + v2 = o + (thetaSegments * i) + thetaSegments + i + mod; + + 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 + mod; + v2 = o + (thetaSegments * i) + thetaSegments + 1 + i + mod; + v3 = o + (thetaSegments * i) + 1 + i + mod; + + 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 ); -- GitLab