RingGeometry.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /**
  2. * @author Kaleb Murphy
  3. */
  4. THREE.RingGeometry = function ( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {
  5. THREE.Geometry.call( this );
  6. innerRadius = innerRadius || 0;
  7. outerRadius = outerRadius || 50;
  8. thetaStart = thetaStart !== undefined ? thetaStart : 0;
  9. thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
  10. thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;
  11. phiSegments = phiSegments !== undefined ? Math.max( 3, phiSegments ) : 8;
  12. var i, o, uvs = [], radius = innerRadius, radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );
  13. for ( i = 0; i <= phiSegments; i ++ ) { // concentric circles inside ring
  14. for ( o = 0; o <= thetaSegments; o ++ ) { // number of segments per circle
  15. var vertex = new THREE.Vector3();
  16. var segment = thetaStart + o / thetaSegments * thetaLength;
  17. vertex.x = radius * Math.cos( segment );
  18. vertex.y = radius * Math.sin( segment );
  19. this.vertices.push( vertex );
  20. uvs.push( new THREE.Vector2( ( vertex.x / radius + 1 ) / 2, - ( vertex.y / radius + 1 ) / 2 + 1 ) );
  21. }
  22. radius += radiusStep;
  23. }
  24. var n = new THREE.Vector3( 0, 0, 1 );
  25. for ( i = 0; i < phiSegments; i ++ ) { // concentric circles inside ring
  26. var thetaSegment = i * thetaSegments;
  27. for ( o = 0; o <= thetaSegments; o ++ ) { // number of segments per circle
  28. var segment = o + thetaSegment;
  29. var v1 = segment + i;
  30. var v2 = segment + thetaSegments + i;
  31. var v3 = segment + thetaSegments + 1 + i;
  32. this.faces.push( new THREE.Face3( v1, v2, v3, [ n, n, n ] ) );
  33. this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ], uvs[ v2 ], uvs[ v3 ] ]);
  34. v1 = segment + i;
  35. v2 = segment + thetaSegments + 1 + i;
  36. v3 = segment + 1 + i;
  37. this.faces.push( new THREE.Face3( v1, v2, v3, [ n, n, n ] ) );
  38. this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ], uvs[ v2 ], uvs[ v3 ] ]);
  39. }
  40. }
  41. this.computeCentroids();
  42. this.computeFaceNormals();
  43. this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );
  44. };
  45. THREE.RingGeometry.prototype = Object.create( THREE.Geometry.prototype );