Jelajahi Sumber

Reduced webvr_rollercoaster scale.

Mr.doob 8 tahun lalu
induk
melakukan
bb485afe16
2 mengubah file dengan 103 tambahan dan 92 penghapusan
  1. 59 59
      examples/js/RollerCoaster.js
  2. 44 33
      examples/webvr_rollercoaster.html

+ 59 - 59
examples/js/RollerCoaster.js

@@ -2,7 +2,7 @@
  * @author mrdoob / http://mrdoob.com/
  * @author mrdoob / http://mrdoob.com/
  */
  */
 
 
-var RollerCoasterGeometry = function ( curve, size ) {
+function RollerCoasterGeometry( curve, divisions ) {
 
 
 	THREE.BufferGeometry.call( this );
 	THREE.BufferGeometry.call( this );
 
 
@@ -28,13 +28,13 @@ var RollerCoasterGeometry = function ( curve, size ) {
 	// shapes
 	// shapes
 
 
 	var step = [
 	var step = [
-		new THREE.Vector3( -2.25,  0, 0 ),
-		new THREE.Vector3(  0,  -0.5, 0 ),
-		new THREE.Vector3(  0, -1.75, 0 ),
+		new THREE.Vector3( -0.225,  0, 0 ),
+		new THREE.Vector3(  0, -0.050, 0 ),
+		new THREE.Vector3(  0, -0.175, 0 ),
 
 
-		new THREE.Vector3(  0,  -0.5, 0 ),
-		new THREE.Vector3(  2.25,  0, 0 ),
-		new THREE.Vector3(  0, -1.75, 0 )
+		new THREE.Vector3(  0, -0.050, 0 ),
+		new THREE.Vector3(  0.225,  0, 0 ),
+		new THREE.Vector3(  0, -0.175, 0 )
 	];
 	];
 
 
 	var PI2 = Math.PI * 2;
 	var PI2 = Math.PI * 2;
@@ -45,7 +45,7 @@ var RollerCoasterGeometry = function ( curve, size ) {
 	for ( var i = 0; i < sides; i ++ ) {
 	for ( var i = 0; i < sides; i ++ ) {
 
 
 		var angle = ( i / sides ) * PI2;
 		var angle = ( i / sides ) * PI2;
-		tube1.push( new THREE.Vector3( Math.sin( angle ) * 0.6, Math.cos( angle ) * 0.6, 0 ) );
+		tube1.push( new THREE.Vector3( Math.sin( angle ) * 0.06, Math.cos( angle ) * 0.06, 0 ) );
 
 
 	}
 	}
 
 
@@ -55,14 +55,14 @@ var RollerCoasterGeometry = function ( curve, size ) {
 	for ( var i = 0; i < sides; i ++ ) {
 	for ( var i = 0; i < sides; i ++ ) {
 
 
 		var angle = ( i / sides ) * PI2;
 		var angle = ( i / sides ) * PI2;
-		tube2.push( new THREE.Vector3( Math.sin( angle ) * 0.25, Math.cos( angle ) * 0.25, 0 ) );
+		tube2.push( new THREE.Vector3( Math.sin( angle ) * 0.025, Math.cos( angle ) * 0.025, 0 ) );
 
 
 	}
 	}
 
 
 	var vector = new THREE.Vector3();
 	var vector = new THREE.Vector3();
 	var normal = new THREE.Vector3();
 	var normal = new THREE.Vector3();
 
 
-	var drawShape = function ( shape, color ) {
+	function drawShape( shape, color ) {
 
 
 		normal.set( 0, 0, -1 ).applyQuaternion( quaternion );
 		normal.set( 0, 0, -1 ).applyQuaternion( quaternion );
 
 
@@ -104,7 +104,7 @@ var RollerCoasterGeometry = function ( curve, size ) {
 	var normal3 = new THREE.Vector3();
 	var normal3 = new THREE.Vector3();
 	var normal4 = new THREE.Vector3();
 	var normal4 = new THREE.Vector3();
 
 
-	var extrudeShape = function ( shape, offset, color ) {
+	function extrudeShape( shape, offset, color ) {
 
 
 		for ( var j = 0, jl = shape.length; j < jl; j ++ ) {
 		for ( var j = 0, jl = shape.length; j < jl; j ++ ) {
 
 
@@ -175,9 +175,9 @@ var RollerCoasterGeometry = function ( curve, size ) {
 
 
 	var offset = new THREE.Vector3();
 	var offset = new THREE.Vector3();
 
 
-	for ( var i = 1; i <= size; i ++ ) {
+	for ( var i = 1; i <= divisions; i ++ ) {
 
 
-		point.copy( curve.getPointAt( i / size ) );
+		point.copy( curve.getPointAt( i / divisions ) );
 
 
 		up.set( 0, 1, 0 );
 		up.set( 0, 1, 0 );
 
 
@@ -195,9 +195,9 @@ var RollerCoasterGeometry = function ( curve, size ) {
 
 
 		}
 		}
 
 
-		extrudeShape( tube1, offset.set( 0, -1.25, 0 ), color2 );
-		extrudeShape( tube2, offset.set( 2, 0, 0 ), color1 );
-		extrudeShape( tube2, offset.set( -2, 0, 0 ), color1 );
+		extrudeShape( tube1, offset.set(  0,  -0.125, 0 ), color2 );
+		extrudeShape( tube2, offset.set(  0.2, 0,     0 ), color1 );
+		extrudeShape( tube2, offset.set( -0.2, 0,     0 ), color1 );
 
 
 		prevPoint.copy( point );
 		prevPoint.copy( point );
 		prevQuaternion.copy( quaternion );
 		prevQuaternion.copy( quaternion );
@@ -214,7 +214,7 @@ var RollerCoasterGeometry = function ( curve, size ) {
 
 
 RollerCoasterGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
 RollerCoasterGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
 
 
-var RollerCoasterLiftersGeometry = function ( curve, size ) {
+function RollerCoasterLiftersGeometry( curve, divisions ) {
 
 
 	THREE.BufferGeometry.call( this );
 	THREE.BufferGeometry.call( this );
 
 
@@ -231,21 +231,21 @@ var RollerCoasterLiftersGeometry = function ( curve, size ) {
 	// shapes
 	// shapes
 
 
 	var tube1 = [
 	var tube1 = [
-		new THREE.Vector3(  0,  0.5, -0.5 ),
-		new THREE.Vector3(  0,  0.5,  0.5 ),
-		new THREE.Vector3(  0, -0.5,  0 )
+		new THREE.Vector3(  0,  0.05, -0.05 ),
+		new THREE.Vector3(  0,  0.05,  0.05 ),
+		new THREE.Vector3(  0, -0.05,  0 )
 	];
 	];
 
 
 	var tube2 = [
 	var tube2 = [
-		new THREE.Vector3( -0.5, 0,  0.5 ),
-		new THREE.Vector3( -0.5, 0, -0.5 ),
-		new THREE.Vector3(  0.5, 0,  0 )
+		new THREE.Vector3( -0.05, 0,  0.05 ),
+		new THREE.Vector3( -0.05, 0, -0.05 ),
+		new THREE.Vector3(  0.05, 0,  0 )
 	];
 	];
 
 
 	var tube3 = [
 	var tube3 = [
-		new THREE.Vector3(  0.5, 0, -0.5 ),
-		new THREE.Vector3(  0.5, 0,  0.5 ),
-		new THREE.Vector3( -0.5, 0,  0 )
+		new THREE.Vector3(  0.05, 0, -0.05 ),
+		new THREE.Vector3(  0.05, 0,  0.05 ),
+		new THREE.Vector3( -0.05, 0,  0 )
 	];
 	];
 
 
 	var vector1 = new THREE.Vector3();
 	var vector1 = new THREE.Vector3();
@@ -258,7 +258,7 @@ var RollerCoasterLiftersGeometry = function ( curve, size ) {
 	var normal3 = new THREE.Vector3();
 	var normal3 = new THREE.Vector3();
 	var normal4 = new THREE.Vector3();
 	var normal4 = new THREE.Vector3();
 
 
-	var extrudeShape = function ( shape, fromPoint, toPoint ) {
+	function extrudeShape( shape, fromPoint, toPoint ) {
 
 
 		for ( var j = 0, jl = shape.length; j < jl; j ++ ) {
 		for ( var j = 0, jl = shape.length; j < jl; j ++ ) {
 
 
@@ -322,10 +322,10 @@ var RollerCoasterLiftersGeometry = function ( curve, size ) {
 	var fromPoint = new THREE.Vector3();
 	var fromPoint = new THREE.Vector3();
 	var toPoint = new THREE.Vector3();
 	var toPoint = new THREE.Vector3();
 
 
-	for ( var i = 1; i <= size; i ++ ) {
+	for ( var i = 1; i <= divisions; i ++ ) {
 
 
-		point.copy( curve.getPointAt( i / size ) );
-		tangent.copy( curve.getTangentAt( i / size ) );
+		point.copy( curve.getPointAt( i / divisions ) );
+		tangent.copy( curve.getTangentAt( i / divisions ) );
 
 
 		var angle = Math.atan2( tangent.x, tangent.z );
 		var angle = Math.atan2( tangent.x, tangent.z );
 
 
@@ -333,33 +333,33 @@ var RollerCoasterLiftersGeometry = function ( curve, size ) {
 
 
 		//
 		//
 
 
-		if ( point.y > 100 ) {
+		if ( point.y > 10 ) {
 
 
-			fromPoint.set( -7.5, -3.5, 0 );
+			fromPoint.set( -0.75, -0.35, 0 );
 			fromPoint.applyQuaternion( quaternion );
 			fromPoint.applyQuaternion( quaternion );
 			fromPoint.add( point );
 			fromPoint.add( point );
 
 
-			toPoint.set( 7.5, -3.5, 0 );
+			toPoint.set( 0.75, -0.35, 0 );
 			toPoint.applyQuaternion( quaternion );
 			toPoint.applyQuaternion( quaternion );
 			toPoint.add( point );
 			toPoint.add( point );
 
 
 			extrudeShape( tube1, fromPoint, toPoint );
 			extrudeShape( tube1, fromPoint, toPoint );
 
 
-			fromPoint.set( -7, -3, 0 );
+			fromPoint.set( -0.7, -0.3, 0 );
 			fromPoint.applyQuaternion( quaternion );
 			fromPoint.applyQuaternion( quaternion );
 			fromPoint.add( point );
 			fromPoint.add( point );
 
 
-			toPoint.set( -7, -point.y, 0 );
+			toPoint.set( -0.7, -point.y, 0 );
 			toPoint.applyQuaternion( quaternion );
 			toPoint.applyQuaternion( quaternion );
 			toPoint.add( point );
 			toPoint.add( point );
 
 
 			extrudeShape( tube2, fromPoint, toPoint );
 			extrudeShape( tube2, fromPoint, toPoint );
 
 
-			fromPoint.set( 7, -3, 0 );
+			fromPoint.set( 0.7, -0.3, 0 );
 			fromPoint.applyQuaternion( quaternion );
 			fromPoint.applyQuaternion( quaternion );
 			fromPoint.add( point );
 			fromPoint.add( point );
 
 
-			toPoint.set( 7, -point.y, 0 );
+			toPoint.set( 0.7, -point.y, 0 );
 			toPoint.applyQuaternion( quaternion );
 			toPoint.applyQuaternion( quaternion );
 			toPoint.add( point );
 			toPoint.add( point );
 
 
@@ -367,7 +367,7 @@ var RollerCoasterLiftersGeometry = function ( curve, size ) {
 
 
 		} else {
 		} else {
 
 
-			fromPoint.set( 0, -2, 0 );
+			fromPoint.set( 0, -0.2, 0 );
 			fromPoint.applyQuaternion( quaternion );
 			fromPoint.applyQuaternion( quaternion );
 			fromPoint.add( point );
 			fromPoint.add( point );
 
 
@@ -388,7 +388,7 @@ var RollerCoasterLiftersGeometry = function ( curve, size ) {
 
 
 RollerCoasterLiftersGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
 RollerCoasterLiftersGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
 
 
-var RollerCoasterShadowGeometry = function ( curve, size ) {
+function RollerCoasterShadowGeometry( curve, divisions ) {
 
 
 	THREE.BufferGeometry.call( this );
 	THREE.BufferGeometry.call( this );
 
 
@@ -412,9 +412,9 @@ var RollerCoasterShadowGeometry = function ( curve, size ) {
 	var vector3 = new THREE.Vector3();
 	var vector3 = new THREE.Vector3();
 	var vector4 = new THREE.Vector3();
 	var vector4 = new THREE.Vector3();
 
 
-	for ( var i = 1; i <= size; i ++ ) {
+	for ( var i = 1; i <= divisions; i ++ ) {
 
 
-		point.copy( curve.getPointAt( i / size ) );
+		point.copy( curve.getPointAt( i / divisions ) );
 		point.y = 0;
 		point.y = 0;
 
 
 		forward.subVectors( point, prevPoint );
 		forward.subVectors( point, prevPoint );
@@ -423,19 +423,19 @@ var RollerCoasterShadowGeometry = function ( curve, size ) {
 
 
 		quaternion.setFromAxisAngle( up, angle );
 		quaternion.setFromAxisAngle( up, angle );
 
 
-		vector1.set( -3, 0, 0 );
+		vector1.set( -0.3, 0, 0 );
 		vector1.applyQuaternion( quaternion );
 		vector1.applyQuaternion( quaternion );
 		vector1.add( point );
 		vector1.add( point );
 
 
-		vector2.set(  3, 0, 0 );
+		vector2.set(  0.3, 0, 0 );
 		vector2.applyQuaternion( quaternion );
 		vector2.applyQuaternion( quaternion );
 		vector2.add( point );
 		vector2.add( point );
 
 
-		vector3.set(  3, 0, 0 );
+		vector3.set(  0.3, 0, 0 );
 		vector3.applyQuaternion( prevQuaternion );
 		vector3.applyQuaternion( prevQuaternion );
 		vector3.add( prevPoint );
 		vector3.add( prevPoint );
 
 
-		vector4.set( -3, 0, 0 );
+		vector4.set( -0.3, 0, 0 );
 		vector4.applyQuaternion( prevQuaternion );
 		vector4.applyQuaternion( prevQuaternion );
 		vector4.add( prevPoint );
 		vector4.add( prevPoint );
 
 
@@ -458,7 +458,7 @@ var RollerCoasterShadowGeometry = function ( curve, size ) {
 
 
 RollerCoasterShadowGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
 RollerCoasterShadowGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
 
 
-var SkyGeometry = function () {
+function SkyGeometry() {
 
 
 	THREE.BufferGeometry.call( this );
 	THREE.BufferGeometry.call( this );
 
 
@@ -466,11 +466,11 @@ var SkyGeometry = function () {
 
 
 	for ( var i = 0; i < 100; i ++ ) {
 	for ( var i = 0; i < 100; i ++ ) {
 
 
-		var x = Math.random() * 8000 - 4000;
-		var y = Math.random() * 500 + 500;
-		var z = Math.random() * 8000 - 4000;
+		var x = Math.random() * 800 - 400;
+		var y = Math.random() * 50 + 50;
+		var z = Math.random() * 800 - 400;
 
 
-		var size = Math.random() * 400 + 200;
+		var size = Math.random() * 40 + 20;
 
 
 		vertices.push( x - size, y, z - size );
 		vertices.push( x - size, y, z - size );
 		vertices.push( x + size, y, z - size );
 		vertices.push( x + size, y, z - size );
@@ -489,7 +489,7 @@ var SkyGeometry = function () {
 
 
 SkyGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
 SkyGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
 
 
-var TreesGeometry = function ( landscape ) {
+function TreesGeometry( landscape ) {
 
 
 	THREE.BufferGeometry.call( this );
 	THREE.BufferGeometry.call( this );
 
 
@@ -501,10 +501,10 @@ var TreesGeometry = function ( landscape ) {
 
 
 	for ( var i = 0; i < 2000; i ++ ) {
 	for ( var i = 0; i < 2000; i ++ ) {
 
 
-		var x = Math.random() * 5000 - 2500;
-		var z = Math.random() * 5000 - 2500;
+		var x = Math.random() * 500 - 250;
+		var z = Math.random() * 500 - 250;
 
 
-		raycaster.ray.origin.set( x, 500, z );
+		raycaster.ray.origin.set( x, 50, z );
 
 
 		var intersections = raycaster.intersectObject( landscape );
 		var intersections = raycaster.intersectObject( landscape );
 
 
@@ -512,19 +512,19 @@ var TreesGeometry = function ( landscape ) {
 
 
 		var y = intersections[ 0 ].point.y;
 		var y = intersections[ 0 ].point.y;
 
 
-		var height = Math.random() * 50 + 5;
+		var height = Math.random() * 5 + 0.5;
 
 
 		var angle = Math.random() * Math.PI * 2;
 		var angle = Math.random() * Math.PI * 2;
 
 
-		vertices.push( x + Math.sin( angle ) * 10, y, z + Math.cos( angle ) * 10 );
+		vertices.push( x + Math.sin( angle ), y, z + Math.cos( angle ) );
 		vertices.push( x, y + height, z );
 		vertices.push( x, y + height, z );
-		vertices.push( x + Math.sin( angle + Math.PI ) * 10, y, z + Math.cos( angle + Math.PI ) * 10 );
+		vertices.push( x + Math.sin( angle + Math.PI ), y, z + Math.cos( angle + Math.PI ) );
 
 
 		angle += Math.PI / 2;
 		angle += Math.PI / 2;
 
 
-		vertices.push( x + Math.sin( angle ) * 10, y, z + Math.cos( angle ) * 10 );
+		vertices.push( x + Math.sin( angle ), y, z + Math.cos( angle ) );
 		vertices.push( x, y + height, z );
 		vertices.push( x, y + height, z );
-		vertices.push( x + Math.sin( angle + Math.PI ) * 10, y, z + Math.cos( angle + Math.PI ) * 10 );
+		vertices.push( x + Math.sin( angle + Math.PI ), y, z + Math.cos( angle + Math.PI ) );
 
 
 		var random = Math.random() * 0.1;
 		var random = Math.random() * 0.1;
 
 

+ 44 - 33
examples/webvr_rollercoaster.html

@@ -52,36 +52,45 @@
 			var train = new THREE.Object3D();
 			var train = new THREE.Object3D();
 			scene.add( train );
 			scene.add( train );
 
 
-			var camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 5000 );
+			var camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 0.1, 500 );
 			camera.rotation.y = Math.PI;
 			camera.rotation.y = Math.PI;
 			train.add( camera );
 			train.add( camera );
 
 
 			// environment
 			// environment
 
 
-			var geometry = new THREE.PlaneGeometry( 5000, 5000, 15, 15 );
+			var geometry = new THREE.PlaneBufferGeometry( 500, 500, 15, 15 );
 			geometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );
 			geometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );
-			var material = new THREE.MeshLambertMaterial( { color: 0x407000, shading: THREE.FlatShading } );
 
 
-			for ( var i = 0; i < geometry.vertices.length; i ++ ) {
+			var positions = geometry.attributes.position.array;
+			var vertex = new THREE.Vector3();
 
 
-				var vertex = geometry.vertices[ i ];
+			for ( var i = 0; i < positions.length; i += 3 ) {
 
 
-				vertex.x += Math.random() * 100 - 50;
-				vertex.z += Math.random() * 100 - 50;
+				vertex.fromArray( positions, i );
 
 
-				var distance = ( vertex.distanceTo( scene.position ) / 5 ) - 250;
+				vertex.x += Math.random() * 10 - 5;
+				vertex.z += Math.random() * 10 - 5;
 
 
+				var distance = ( vertex.distanceTo( scene.position ) / 5 ) - 25;
 				vertex.y = Math.random() * Math.max( 0, distance );
 				vertex.y = Math.random() * Math.max( 0, distance );
 
 
+				vertex.toArray( positions, i );
+
 			}
 			}
 
 
-			geometry.computeFaceNormals();
+			geometry.computeVertexNormals();
+
+			var material = new THREE.MeshLambertMaterial( {
+				color: 0x407000
+			} );
 
 
 			var mesh = new THREE.Mesh( geometry, material );
 			var mesh = new THREE.Mesh( geometry, material );
 			scene.add( mesh );
 			scene.add( mesh );
 
 
 			var geometry = new TreesGeometry( mesh );
 			var geometry = new TreesGeometry( mesh );
-			var material = new THREE.MeshBasicMaterial( { side: THREE.DoubleSide, vertexColors: THREE.VertexColors } );
+			var material = new THREE.MeshBasicMaterial( {
+				side: THREE.DoubleSide, vertexColors: THREE.VertexColors
+			} );
 			var mesh = new THREE.Mesh( geometry, material );
 			var mesh = new THREE.Mesh( geometry, material );
 			scene.add( mesh );
 			scene.add( mesh );
 
 
@@ -106,10 +115,10 @@
 						t = t * PI2;
 						t = t * PI2;
 
 
 						var x = Math.sin( t * 3 ) * Math.cos( t * 4 ) * 50;
 						var x = Math.sin( t * 3 ) * Math.cos( t * 4 ) * 50;
-						var y = Math.sin( t * 10 ) * 2 + Math.cos( t * 17 ) * 2 + 4;
+						var y = Math.sin( t * 10 ) * 2 + Math.cos( t * 17 ) * 2 + 5;
 						var z = Math.sin( t ) * Math.sin( t * 4 ) * 50;
 						var z = Math.sin( t ) * Math.sin( t * 4 ) * 50;
 
 
-						return vector.set( x, y, z ).multiplyScalar( 20 );
+						return vector.set( x, y, z ).multiplyScalar( 2 );
 
 
 					},
 					},
 
 
@@ -119,7 +128,8 @@
 						var t1 = Math.max( 0, t - delta );
 						var t1 = Math.max( 0, t - delta );
 						var t2 = Math.min( 1, t + delta );
 						var t2 = Math.min( 1, t + delta );
 
 
-						return vector2.copy( this.getPointAt ( t2 ) ).sub( this.getPointAt( t1 ) ).normalize();
+						return vector2.copy( this.getPointAt ( t2 ) )
+							.sub( this.getPointAt( t1 ) ).normalize();
 
 
 					}
 					}
 
 
@@ -128,46 +138,47 @@
 			} )();
 			} )();
 
 
 			var geometry = new RollerCoasterGeometry( curve, 1500 );
 			var geometry = new RollerCoasterGeometry( curve, 1500 );
-			var material = new THREE.MeshStandardMaterial( {
-				roughness: 0.1,
-				metalness: 0,
+			var material = new THREE.MeshPhongMaterial( {
 				vertexColors: THREE.VertexColors
 				vertexColors: THREE.VertexColors
 			} );
 			} );
 			var mesh = new THREE.Mesh( geometry, material );
 			var mesh = new THREE.Mesh( geometry, material );
 			scene.add( mesh );
 			scene.add( mesh );
 
 
 			var geometry = new RollerCoasterLiftersGeometry( curve, 100 );
 			var geometry = new RollerCoasterLiftersGeometry( curve, 100 );
-			var material = new THREE.MeshStandardMaterial( {
-				roughness: 0.1,
-				metalness: 0
-			} );
+			var material = new THREE.MeshPhongMaterial();
 			var mesh = new THREE.Mesh( geometry, material );
 			var mesh = new THREE.Mesh( geometry, material );
-			mesh.position.y = 1;
+			mesh.position.y = 0.1;
 			scene.add( mesh );
 			scene.add( mesh );
 
 
 			var geometry = new RollerCoasterShadowGeometry( curve, 500 );
 			var geometry = new RollerCoasterShadowGeometry( curve, 500 );
-			var material = new THREE.MeshBasicMaterial( { color: 0x000000, opacity: 0.1, depthWrite: false, transparent: true } );
+			var material = new THREE.MeshBasicMaterial( {
+				color: 0x305000, depthWrite: false, transparent: true
+			} );
 			var mesh = new THREE.Mesh( geometry, material );
 			var mesh = new THREE.Mesh( geometry, material );
-			mesh.position.y = 1;
+			mesh.position.y = 0.1;
 			scene.add( mesh );
 			scene.add( mesh );
 
 
 			var funfairs = [];
 			var funfairs = [];
 
 
 			//
 			//
 
 
-			var geometry = new THREE.CylinderGeometry( 100, 100, 50, 15 );
-			var material = new THREE.MeshLambertMaterial( { color: 0xff8080, shading: THREE.FlatShading } );
+			var geometry = new THREE.CylinderBufferGeometry( 10, 10, 5, 15 );
+			var material = new THREE.MeshLambertMaterial( {
+				color: 0xff8080, shading: THREE.FlatShading
+			} );
 			var mesh = new THREE.Mesh( geometry, material );
 			var mesh = new THREE.Mesh( geometry, material );
-			mesh.position.set( - 800, 100, - 700 );
+			mesh.position.set( - 80, 10, - 70 );
 			mesh.rotation.x = Math.PI / 2;
 			mesh.rotation.x = Math.PI / 2;
 			scene.add( mesh );
 			scene.add( mesh );
 
 
 			funfairs.push( mesh );
 			funfairs.push( mesh );
 
 
-			var geometry = new THREE.CylinderGeometry( 50, 60, 40, 10 );
-			var material = new THREE.MeshLambertMaterial( { color: 0x8080ff, shading: THREE.FlatShading } );
+			var geometry = new THREE.CylinderBufferGeometry( 5, 6, 4, 10 );
+			var material = new THREE.MeshLambertMaterial( {
+				color: 0x8080ff, shading: THREE.FlatShading
+			} );
 			var mesh = new THREE.Mesh( geometry, material );
 			var mesh = new THREE.Mesh( geometry, material );
-			mesh.position.set( 500, 20, 300 );
+			mesh.position.set( 50, 2, 30 );
 			scene.add( mesh );
 			scene.add( mesh );
 
 
 			funfairs.push( mesh );
 			funfairs.push( mesh );
@@ -210,11 +221,11 @@
 
 
 				effect.requestAnimationFrame( animate );
 				effect.requestAnimationFrame( animate );
 
 
-				var delta = ( time - prevTime ) / 15;
+				var delta = time - prevTime;
 
 
 				for ( var i = 0; i < funfairs.length; i ++ ) {
 				for ( var i = 0; i < funfairs.length; i ++ ) {
 
 
-					funfairs[ i ].rotation.y = time * 0.0002;
+					funfairs[ i ].rotation.y = time * 0.0004;
 
 
 				}
 				}
 
 
@@ -224,13 +235,13 @@
 				progress = progress % 1;
 				progress = progress % 1;
 
 
 				position.copy( curve.getPointAt( progress ) );
 				position.copy( curve.getPointAt( progress ) );
-				position.y += 3;
+				position.y += 0.3;
 
 
 				train.position.copy( position );
 				train.position.copy( position );
 
 
 				tangent.copy( curve.getTangentAt( progress ) );
 				tangent.copy( curve.getTangentAt( progress ) );
 
 
-				velocity -= tangent.y * 0.000001 * delta;
+				velocity -= tangent.y * 0.0000001 * delta;
 				velocity = Math.max( 0.00004, Math.min( 0.0002, velocity ) );
 				velocity = Math.max( 0.00004, Math.min( 0.0002, velocity ) );
 
 
 				train.lookAt( lookAt.copy( position ).add( tangent ) );
 				train.lookAt( lookAt.copy( position ).add( tangent ) );