123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /**
- * @author benaadams / https://twitter.com/ben_a_adams
- */
- THREE.CircleBufferGeometry = function ( radius, segments, thetaStart, thetaLength ) {
- THREE.BufferGeometry.call( this );
- this.type = 'CircleBufferGeometry';
- this.parameters = {
- radius: radius,
- segments: segments,
- thetaStart: thetaStart,
- thetaLength: thetaLength
- };
- radius = radius || 50;
- segments = segments !== undefined ? Math.max( 3, segments ) : 8;
- thetaStart = thetaStart !== undefined ? thetaStart : 0;
- thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
- var vertices = segments + 2;
- var positions = new Float32Array( vertices * 3 );
- var normals = new Float32Array( vertices * 3 );
- var uvs = new Float32Array( vertices * 2 );
- // center data is already zero, but need to set a few extras
- normals[ 2 ] = 1.0;
- uvs[ 0 ] = 0.5;
- uvs[ 1 ] = 0.5;
- for ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) {
- var segment = thetaStart + s / segments * thetaLength;
- positions[ i ] = radius * Math.cos( segment );
- positions[ i + 1 ] = radius * Math.sin( segment );
- normals[ i + 2 ] = 1; // normal z
- uvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2;
- uvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2;
- }
- var indices = [];
- for ( var i = 1; i <= segments; i ++ ) {
- indices.push( i );
- indices.push( i + 1 );
- indices.push( 0 );
- }
- this.setIndex( new THREE.BufferAttribute( new Uint16Array( indices ), 1 ) );
- this.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
- this.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );
- this.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );
- this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );
- };
- THREE.CircleBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
- THREE.CircleBufferGeometry.prototype.constructor = THREE.CircleBufferGeometry;
- THREE.CircleBufferGeometry.prototype.clone = function () {
- var geometry = new THREE.CircleBufferGeometry(
- this.parameters.radius,
- this.parameters.segments,
- this.parameters.thetaStart,
- this.parameters.thetaLength
- );
- geometry.copy( this );
- return geometry;
- };
|