| function generateGeometry( objectType, numObjects ) { |
|
|
| function applyVertexColors( geometry, color ) { |
|
|
| var position = geometry.attributes.position; |
| var colors = []; |
|
|
| for ( var i = 0; i < position.count; i ++ ) { |
|
|
| colors.push( color.r, color.g, color.b ); |
|
|
| } |
|
|
| geometry.addAttribute( 'color', new THREE.Float32BufferAttribute( colors, 3 ) ); |
|
|
| } |
|
|
| var geometries = []; |
|
|
| var matrix = new THREE.Matrix4(); |
| var position = new THREE.Vector3(); |
| var rotation = new THREE.Euler(); |
| var quaternion = new THREE.Quaternion(); |
| var scale = new THREE.Vector3(); |
| var color = new THREE.Color(); |
|
|
| for ( var i = 0; i < numObjects; i ++ ) { |
|
|
| position.x = Math.random() * 10000 - 5000; |
| position.y = Math.random() * 6000 - 3000; |
| position.z = Math.random() * 8000 - 4000; |
|
|
| rotation.x = Math.random() * 2 * Math.PI; |
| rotation.y = Math.random() * 2 * Math.PI; |
| rotation.z = Math.random() * 2 * Math.PI; |
| quaternion.setFromEuler( rotation, false ); |
|
|
| scale.x = Math.random() * 200 + 100; |
|
|
| var geometry; |
|
|
| if ( objectType === 'cube' ) { |
|
|
| geometry = new THREE.BoxBufferGeometry( 1, 1, 1 ); |
| geometry = geometry.toNonIndexed(); |
| scale.y = Math.random() * 200 + 100; |
| scale.z = Math.random() * 200 + 100; |
| color.setRGB( 0, 0, 0.1 + 0.9 * Math.random() ); |
|
|
| } else if ( objectType === 'sphere' ) { |
|
|
| geometry = new THREE.IcosahedronBufferGeometry( 1, 1 ); |
| scale.y = scale.z = scale.x; |
| color.setRGB( 0.1 + 0.9 * Math.random(), 0, 0 ); |
|
|
| } |
|
|
| |
| applyVertexColors( geometry, color ); |
|
|
| matrix.compose( position, quaternion, scale ); |
| geometry.applyMatrix( matrix ); |
|
|
| geometries.push( geometry ); |
|
|
| } |
|
|
| return THREE.BufferGeometryUtils.mergeBufferGeometries( geometries ); |
|
|
| } |
|
|
| function Scene( type, numObjects, cameraZ, fov, rotationSpeed, clearColor ) { |
|
|
| this.clearColor = clearColor; |
|
|
| this.camera = new THREE.PerspectiveCamera( fov, window.innerWidth / window.innerHeight, 1, 10000 ); |
| this.camera.position.z = cameraZ; |
|
|
| |
| this.scene = new THREE.Scene(); |
| this.scene.add( new THREE.AmbientLight( 0x555555 ) ); |
|
|
| var light = new THREE.SpotLight( 0xffffff, 1.5 ); |
| light.position.set( 0, 500, 2000 ); |
| this.scene.add( light ); |
|
|
| this.rotationSpeed = rotationSpeed; |
|
|
| var defaultMaterial = new THREE.MeshPhongMaterial( { color: 0xffffff, flatShading: true, vertexColors: THREE.VertexColors } ); |
| this.mesh = new THREE.Mesh( generateGeometry( type, numObjects ), defaultMaterial ); |
| this.scene.add( this.mesh ); |
|
|
| var renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false }; |
| this.fbo = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, renderTargetParameters ); |
|
|
| this.render = function ( delta, rtt ) { |
|
|
| this.mesh.rotation.x += delta * this.rotationSpeed.x; |
| this.mesh.rotation.y += delta * this.rotationSpeed.y; |
| this.mesh.rotation.z += delta * this.rotationSpeed.z; |
|
|
| renderer.setClearColor( this.clearColor ); |
|
|
| if ( rtt ) { |
|
|
| renderer.setRenderTarget( this.fbo ); |
| renderer.clear(); |
| renderer.render( this.scene, this.camera ); |
|
|
| } else { |
|
|
| renderer.setRenderTarget( null ); |
| renderer.render( this.scene, this.camera ); |
|
|
| } |
|
|
| }; |
|
|
| } |
|
|