123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /**
- * @author mr.doob / http://mrdoob.com/
- * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Sphere.as
- */
- var Sphere = function ( radius, segments_width, segments_height, smooth ) {
- THREE.Geometry.call( this );
- var gridX = segments_width || 8,
- gridY = segments_height || 6;
- var i, j;
- var iHor = Math.max( 3, gridX );
- var iVer = Math.max( 2, gridY );
- var aVtc = [];
- for ( j = 0; j < ( iVer + 1 ) ; j++ ) {
- var fRad1 = j / iVer;
- var fZ = radius * Math.cos( fRad1 * Math.PI );
- var fRds = radius * Math.sin( fRad1 * Math.PI );
- var aRow = [];
- var oVtx = 0;
- for ( i = 0; i < iHor; i++ ) {
- var fRad2 = 2 * i / iHor;
- var fX = fRds * Math.sin( fRad2 * Math.PI );
- var fY = fRds * Math.cos( fRad2 * Math.PI );
- if ( !( ( j == 0 || j == iVer ) && i > 0 ) ) {
- oVtx = this.vertices.push( new THREE.Vertex( new THREE.Vector3( fY, fZ, fX ) ) ) - 1;
- }
- aRow.push( oVtx );
- }
- aVtc.push( aRow );
- }
- var n1, n2, n3, iVerNum = aVtc.length;
- for ( j = 0; j < iVerNum; j++ ) {
- var iHorNum = aVtc[ j ].length;
- if ( j > 0 ) {
- for ( i = 0; i < iHorNum; i++ ) {
- var bEnd = i == ( iHorNum - 1 );
- var aP1 = aVtc[ j ][ bEnd ? 0 : i + 1 ];
- var aP2 = aVtc[ j ][ ( bEnd ? iHorNum - 1 : i ) ];
- var aP3 = aVtc[ j - 1 ][ ( bEnd ? iHorNum - 1 : i ) ];
- var aP4 = aVtc[ j - 1 ][ bEnd ? 0 : i + 1 ];
- var fJ0 = j / ( iVerNum - 1 );
- var fJ1 = ( j - 1 ) / ( iVerNum - 1 );
- var fI0 = ( i + 1 ) / iHorNum;
- var fI1 = i / iHorNum;
- var aP1uv = new THREE.UV( 1 - fI0, fJ0 );
- var aP2uv = new THREE.UV( 1 - fI1, fJ0 );
- var aP3uv = new THREE.UV( 1 - fI1, fJ1 );
- var aP4uv = new THREE.UV( 1 - fI0, fJ1 );
- if ( j < ( aVtc.length - 1 ) ) {
- n1 = this.vertices[ aP1 ].position.clone();
- n2 = this.vertices[ aP2 ].position.clone();
- n3 = this.vertices[ aP3 ].position.clone();
- n1.normalize();
- n2.normalize();
- n3.normalize();
- if ( smooth ) {
- this.faces.push( new THREE.Face3( aP1, aP2, aP3, [ new THREE.Vector3( n1.x, n1.y, n1.z ), new THREE.Vector3( n2.x, n2.y, n2.z ), new THREE.Vector3( n3.x, n3.y, n3.z ) ] ) );
- } else {
- this.faces.push( new THREE.Face3( aP1, aP2, aP3 ) );
- }
- this.uvs.push( [ aP1uv, aP2uv, aP3uv ] );
- }
- if ( j > 1 ) {
- n1 = this.vertices[aP1].position.clone();
- n2 = this.vertices[aP3].position.clone();
- n3 = this.vertices[aP4].position.clone();
- n1.normalize();
- n2.normalize();
- n3.normalize();
- if ( smooth ) {
- this.faces.push( new THREE.Face3( aP1, aP3, aP4, [ new THREE.Vector3( n1.x, n1.y, n1.z ), new THREE.Vector3( n2.x, n2.y, n2.z ), new THREE.Vector3( n3.x, n3.y, n3.z ) ] ) );
- } else {
- this.faces.push( new THREE.Face3( aP1, aP3, aP4 ) );
- }
- this.uvs.push( [ aP1uv, aP3uv, aP4uv ] );
- }
- }
- }
- }
- this.computeCentroids();
- this.computeNormals();
- }
- Sphere.prototype = new THREE.Geometry();
- Sphere.prototype.constructor = Sphere;
|