diff --git a/examples/materials_cubemap_sky.html b/examples/materials_cubemap_sky.html index eab258273928e05f26a0b31da2b694e5063a3123..9d057b3c37462308223d9744c275cb485996fe60 100644 --- a/examples/materials_cubemap_sky.html +++ b/examples/materials_cubemap_sky.html @@ -36,6 +36,7 @@ + @@ -76,27 +77,31 @@ scene = new THREE.Scene(); sceneCube = new THREE.Scene(); - var r = "textures/skymap_"; + var geometry = new THREE.Geometry(); + var sphere = new THREE.Mesh( new Sphere( 100, 32, 16 ) ); + + for ( var i = 0; i < 200; i ++ ) { + + sphere.position.x = Math.random() * 10000 - 5000; + sphere.position.y = Math.random() * 10000 - 5000; + sphere.position.z = Math.random() * 10000 - 5000; + sphere.scale.x = sphere.scale.y = sphere.scale.z = Math.random() * 4 + 1; + + // Merging spheres in a single geometry + GeometryUtils.merge( geometry, sphere ); + } + var r = "textures/skymap_"; var urls = [ r + "right1024.jpg", r + "left1024.jpg", r + "top1024.jpg", r + "bottom1024.jpg", r + "front1024.jpg", r + "back1024.jpg" ]; var images = loadImageArray( urls ); - var material = new THREE.MeshBasicMaterial( { color: 0xffffff, env_map: new THREE.TextureCube( images ) } ); - var geometry = new Sphere( 100, 32, 16, true ); - - for ( var i = 0; i < 200; i ++ ) { - - var mesh = new THREE.Mesh( geometry, material ); - mesh.position.x = Math.random() * 10000 - 5000; - mesh.position.y = Math.random() * 10000 - 5000; - mesh.position.z = Math.random() * 10000 - 5000; - mesh.scale.x = mesh.scale.y = mesh.scale.z = Math.random() * 4 + 1; - scene.addObject( mesh ); - } + var mesh = new THREE.Mesh( geometry, material ); + mesh.position.x = 100; + scene.addObject( mesh ); createCube( 100000, images ); diff --git a/src/core/Face3.js b/src/core/Face3.js index f03147a97c47fddcff07932a0fb2f0b9adc77f79..e8e62cd412228136d6448f3686fd16a0cb022191 100644 --- a/src/core/Face3.js +++ b/src/core/Face3.js @@ -10,7 +10,7 @@ THREE.Face3 = function ( a, b, c, normal, material ) { this.centroid = new THREE.Vector3(); this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3(); - this.vertexNormals = normal instanceof Array ? normal : []; + this.vertexNormals = normal instanceof Array ? normal : []; this.material = material instanceof Array ? material : [ material ]; diff --git a/src/core/Face4.js b/src/core/Face4.js index 36847160b163b5d23e0358c59efa6fe7d6adc181..0bab13804c458f8eb4d89f536c7b0730205964f1 100644 --- a/src/core/Face4.js +++ b/src/core/Face4.js @@ -11,7 +11,7 @@ THREE.Face4 = function ( a, b, c, d, normal, material ) { this.centroid = new THREE.Vector3(); this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3(); - this.vertexNormals = normal instanceof Array ? normal : []; + this.vertexNormals = normal instanceof Array ? normal : []; this.material = material instanceof Array ? material : [ material ]; diff --git a/src/extras/GeometryUtils.js b/src/extras/GeometryUtils.js new file mode 100644 index 0000000000000000000000000000000000000000..77db23c80ea3fd00bd7ad4ed36ee7b919c797358 --- /dev/null +++ b/src/extras/GeometryUtils.js @@ -0,0 +1,76 @@ +var GeometryUtils = { + + merge: function ( object1, object2 ) { + + var isMesh = object2 instanceof THREE.Mesh; + + var geometry1 = object1, + vertexPosition = geometry1.vertices.length, + facePosition = geometry1.faces.length, + uvPosition = geometry1.uvs.length, + geometry2 = isMesh ? object2.geometry : object2; + + if ( isMesh ) object2.updateMatrix(); + + for ( var i = 0, il = geometry2.vertices.length; i < il; i ++ ) { + + var vertex = geometry2.vertices[ i ]; + + var vertexCopy = new THREE.Vertex( vertex.position.clone() ); + + if ( isMesh ) object2.matrix.transform( vertexCopy.position ); + + geometry1.vertices.push( vertexCopy ); + + } + + for ( var i = 0, il = geometry2.faces.length; i < il; i ++ ) { + + var face = geometry2.faces[ i ]; + + if ( face instanceof THREE.Face3 ) { + + var faceCopy = new THREE.Face3(); + faceCopy.a = face.a + vertexPosition; + faceCopy.b = face.b + vertexPosition; + faceCopy.c = face.c + vertexPosition; + + } else if ( face instanceof THREE.Face4 ) { + + var faceCopy = new THREE.Face4(); + faceCopy.a = face.a + vertexPosition; + faceCopy.b = face.b + vertexPosition; + faceCopy.c = face.c + vertexPosition; + faceCopy.d = face.d + vertexPosition; + + } + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var normal = face.vertexNormals[ j ]; + faceCopy.vertexNormals.push( normal.clone() ); + } + + geometry1.faces.push( faceCopy ); + + } + + for ( var i = 0, il = geometry2.uvs.length; i < il; i ++ ) { + + var uv = geometry2.uvs[ i ]; + + var uvCopy = []; + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) ); + + } + + geometry1.uvs.push( uvCopy ); + + } + + } + +} diff --git a/src/extras/primitives/Sphere.js b/src/extras/primitives/Sphere.js index 2df1717960a1e7507029e0a506b4e6309f35bda1..c542839900b34fe5ee965c0b3fd7fdf260b20d84 100644 --- a/src/extras/primitives/Sphere.js +++ b/src/extras/primitives/Sphere.js @@ -3,7 +3,7 @@ * 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 ) { +var Sphere = function ( radius, segments_width, segments_height ) { THREE.Geometry.call( this ); @@ -78,15 +78,7 @@ var Sphere = function ( radius, segments_width, segments_height, smooth ) { 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.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 ) ] ) ); this.uvs.push( [ aP1uv, aP2uv, aP3uv ] ); @@ -101,15 +93,7 @@ var Sphere = function ( radius, segments_width, segments_height, smooth ) { 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.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 ) ] ) ); this.uvs.push( [ aP1uv, aP3uv, aP4uv ] ); diff --git a/src/objects/Mesh.js b/src/objects/Mesh.js index e2683df64269b1dcd0826fd7c27bd0e44eec505e..a6828f3386b1928b3be5943e82b6c817853604b4 100644 --- a/src/objects/Mesh.js +++ b/src/objects/Mesh.js @@ -16,7 +16,7 @@ THREE.Mesh = function ( geometry, material, normUVs ) { this.materialFaceGroup = {}; this.sortFacesByMaterial(); - if( normUVs ) this.normalizeUVs(); + if ( normUVs ) this.normalizeUVs(); this.geometry.computeBoundingBox();