RingGeometry.js 2.4 KB

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