webvr_rollercoaster.html 6.2 KB
Newer Older
M
r75  
Mr.doob 已提交
1 2 3
<!DOCTYPE html>
<html lang="en">
	<head>
M
r76  
Mr.doob 已提交
4
		<title>three.js webvr - roller coaster</title>
M
r75  
Mr.doob 已提交
5 6
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
M
Mugen87 已提交
7 8
		<!-- Origin Trial Token, feature = WebVR (For Chrome M62+), origin = https://threejs.org, expires = 2017-12-16 -->
		<meta http-equiv="origin-trial" data-feature="WebVR (For Chrome M62+)" data-expires="2017-12-16" content="AvEXeg7kY84HQ60ApBlqf6zPqClJwEy499YltannXHd+qIIN8ibQQFbHDkKL/Na/L7ha4VOqsjsGHhFpI6HYfgAAAABQeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJWUjEuMU02MiIsImV4cGlyeSI6MTUxMzQ0NjE5Nn0=">
M
r75  
Mr.doob 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
		<style>
			body {
				margin: 0px;
				color: #fff;
				font-family: Monospace;
				background-color: #444;
				overflow: hidden;
			}
			a {
				color: #00f;
			}
		</style>
	</head>
	<body>

M
r76  
Mr.doob 已提交
24
		<script src="../build/three.js"></script>
M
r75  
Mr.doob 已提交
25 26 27

		<script src="js/RollerCoaster.js"></script>

M
r82  
Mr.doob 已提交
28
		<script src="js/vr/WebVR.js"></script>
M
r75  
Mr.doob 已提交
29 30 31 32 33 34

		<script>

			var renderer = new THREE.WebGLRenderer( { antialias: true } );
			renderer.setPixelRatio( window.devicePixelRatio );
			renderer.setSize( window.innerWidth, window.innerHeight );
M
r88  
Mr.doob 已提交
35
			renderer.vr.enabled = true;
M
r75  
Mr.doob 已提交
36 37
			document.body.appendChild( renderer.domElement );

M
r88  
Mr.doob 已提交
38 39 40
			document.body.appendChild( WEBVR.createButton( renderer ) );

			//
M
r86  
Mr.doob 已提交
41

M
r75  
Mr.doob 已提交
42
			var scene = new THREE.Scene();
M
r87  
Mr.doob 已提交
43
			scene.background = new THREE.Color( 0xf0f0ff );
M
r75  
Mr.doob 已提交
44 45 46 47 48 49 50 51

			var light = new THREE.HemisphereLight( 0xfff0f0, 0x606066 );
			light.position.set( 1, 1, 1 );
			scene.add( light );

			var train = new THREE.Object3D();
			scene.add( train );

M
r85  
Mr.doob 已提交
52
			var camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 0.1, 500 );
M
r75  
Mr.doob 已提交
53 54 55 56
			train.add( camera );

			// environment

M
r85  
Mr.doob 已提交
57
			var geometry = new THREE.PlaneBufferGeometry( 500, 500, 15, 15 );
M
r75  
Mr.doob 已提交
58 59
			geometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );

M
r85  
Mr.doob 已提交
60 61
			var positions = geometry.attributes.position.array;
			var vertex = new THREE.Vector3();
M
r75  
Mr.doob 已提交
62

M
r85  
Mr.doob 已提交
63
			for ( var i = 0; i < positions.length; i += 3 ) {
M
r75  
Mr.doob 已提交
64

M
r85  
Mr.doob 已提交
65
				vertex.fromArray( positions, i );
M
r75  
Mr.doob 已提交
66

M
r85  
Mr.doob 已提交
67 68
				vertex.x += Math.random() * 10 - 5;
				vertex.z += Math.random() * 10 - 5;
M
r75  
Mr.doob 已提交
69

M
r85  
Mr.doob 已提交
70
				var distance = ( vertex.distanceTo( scene.position ) / 5 ) - 25;
M
r75  
Mr.doob 已提交
71 72
				vertex.y = Math.random() * Math.max( 0, distance );

M
r85  
Mr.doob 已提交
73 74
				vertex.toArray( positions, i );

M
r75  
Mr.doob 已提交
75 76
			}

M
r85  
Mr.doob 已提交
77 78 79 80 81
			geometry.computeVertexNormals();

			var material = new THREE.MeshLambertMaterial( {
				color: 0x407000
			} );
M
r75  
Mr.doob 已提交
82 83 84 85 86

			var mesh = new THREE.Mesh( geometry, material );
			scene.add( mesh );

			var geometry = new TreesGeometry( mesh );
M
r85  
Mr.doob 已提交
87 88 89
			var material = new THREE.MeshBasicMaterial( {
				side: THREE.DoubleSide, vertexColors: THREE.VertexColors
			} );
M
r75  
Mr.doob 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
			var mesh = new THREE.Mesh( geometry, material );
			scene.add( mesh );

			var geometry = new SkyGeometry();
			var material = new THREE.MeshBasicMaterial( { color: 0xffffff } );
			var mesh = new THREE.Mesh( geometry, material );
			scene.add( mesh );

			//

			var PI2 = Math.PI * 2;

			var curve = ( function () {

				var vector = new THREE.Vector3();
				var vector2 = new THREE.Vector3();

				return {

					getPointAt: function ( t ) {

M
r85  
Mr.doob 已提交
111
						t = t * PI2;
M
r75  
Mr.doob 已提交
112

M
r85  
Mr.doob 已提交
113 114 115
						var x = Math.sin( t * 3 ) * Math.cos( t * 4 ) * 50;
						var y = Math.sin( t * 10 ) * 2 + Math.cos( t * 17 ) * 2 + 5;
						var z = Math.sin( t ) * Math.sin( t * 4 ) * 50;
M
r75  
Mr.doob 已提交
116

M
r85  
Mr.doob 已提交
117
						return vector.set( x, y, z ).multiplyScalar( 2 );
M
r75  
Mr.doob 已提交
118 119 120 121 122 123 124 125 126

					},

					getTangentAt: function ( t ) {

						var delta = 0.0001;
						var t1 = Math.max( 0, t - delta );
						var t2 = Math.min( 1, t + delta );

M
r85  
Mr.doob 已提交
127 128
						return vector2.copy( this.getPointAt ( t2 ) )
							.sub( this.getPointAt( t1 ) ).normalize();
M
r75  
Mr.doob 已提交
129 130 131 132 133 134 135 136

					}

				};

			} )();

			var geometry = new RollerCoasterGeometry( curve, 1500 );
M
r85  
Mr.doob 已提交
137
			var material = new THREE.MeshPhongMaterial( {
M
r75  
Mr.doob 已提交
138 139 140 141 142 143
				vertexColors: THREE.VertexColors
			} );
			var mesh = new THREE.Mesh( geometry, material );
			scene.add( mesh );

			var geometry = new RollerCoasterLiftersGeometry( curve, 100 );
M
r85  
Mr.doob 已提交
144
			var material = new THREE.MeshPhongMaterial();
M
r75  
Mr.doob 已提交
145
			var mesh = new THREE.Mesh( geometry, material );
M
r85  
Mr.doob 已提交
146
			mesh.position.y = 0.1;
M
r75  
Mr.doob 已提交
147 148 149
			scene.add( mesh );

			var geometry = new RollerCoasterShadowGeometry( curve, 500 );
M
r85  
Mr.doob 已提交
150 151 152
			var material = new THREE.MeshBasicMaterial( {
				color: 0x305000, depthWrite: false, transparent: true
			} );
M
r75  
Mr.doob 已提交
153
			var mesh = new THREE.Mesh( geometry, material );
M
r85  
Mr.doob 已提交
154
			mesh.position.y = 0.1;
M
r75  
Mr.doob 已提交
155 156 157 158 159 160
			scene.add( mesh );

			var funfairs = [];

			//

M
r85  
Mr.doob 已提交
161 162
			var geometry = new THREE.CylinderBufferGeometry( 10, 10, 5, 15 );
			var material = new THREE.MeshLambertMaterial( {
M
r87  
Mr.doob 已提交
163 164
				color: 0xff8080,
				//flatShading: true // Lambert does not support flat shading
M
r85  
Mr.doob 已提交
165
			} );
M
r75  
Mr.doob 已提交
166
			var mesh = new THREE.Mesh( geometry, material );
M
r85  
Mr.doob 已提交
167
			mesh.position.set( - 80, 10, - 70 );
M
r75  
Mr.doob 已提交
168 169 170 171 172
			mesh.rotation.x = Math.PI / 2;
			scene.add( mesh );

			funfairs.push( mesh );

M
r85  
Mr.doob 已提交
173 174
			var geometry = new THREE.CylinderBufferGeometry( 5, 6, 4, 10 );
			var material = new THREE.MeshLambertMaterial( {
M
r87  
Mr.doob 已提交
175 176
				color: 0x8080ff,
				//flatShading: true // Lambert does not support flat shading
M
r85  
Mr.doob 已提交
177
			} );
M
r75  
Mr.doob 已提交
178
			var mesh = new THREE.Mesh( geometry, material );
M
r85  
Mr.doob 已提交
179
			mesh.position.set( 50, 2, 30 );
M
r75  
Mr.doob 已提交
180 181 182 183 184 185
			scene.add( mesh );

			funfairs.push( mesh );

			//

M
r86  
Mr.doob 已提交
186 187 188
			window.addEventListener( 'resize', onWindowResize, false );

			function onWindowResize() {
M
r75  
Mr.doob 已提交
189 190 191 192

				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();

M
r86  
Mr.doob 已提交
193
				renderer.setSize( window.innerWidth, window.innerHeight );
M
r75  
Mr.doob 已提交
194

M
r86  
Mr.doob 已提交
195
			}
M
r75  
Mr.doob 已提交
196 197 198 199 200 201 202 203 204 205 206

			//

			var position = new THREE.Vector3();
			var tangent = new THREE.Vector3();

			var lookAt = new THREE.Vector3();

			var velocity = 0;
			var progress = 0;

M
r85  
Mr.doob 已提交
207
			var prevTime = performance.now();
M
r79  
Mr.doob 已提交
208

M
r86  
Mr.doob 已提交
209
			function render() {
M
r79  
Mr.doob 已提交
210

M
r86  
Mr.doob 已提交
211
				var time = performance.now();
M
r85  
Mr.doob 已提交
212
				var delta = time - prevTime;
M
r75  
Mr.doob 已提交
213 214 215

				for ( var i = 0; i < funfairs.length; i ++ ) {

M
r85  
Mr.doob 已提交
216
					funfairs[ i ].rotation.y = time * 0.0004;
M
r75  
Mr.doob 已提交
217 218 219 220 221

				}

				//

M
r85  
Mr.doob 已提交
222
				progress += velocity;
M
r75  
Mr.doob 已提交
223 224 225
				progress = progress % 1;

				position.copy( curve.getPointAt( progress ) );
M
r85  
Mr.doob 已提交
226
				position.y += 0.3;
M
r75  
Mr.doob 已提交
227 228 229 230 231

				train.position.copy( position );

				tangent.copy( curve.getTangentAt( progress ) );

M
r85  
Mr.doob 已提交
232 233
				velocity -= tangent.y * 0.0000001 * delta;
				velocity = Math.max( 0.00004, Math.min( 0.0002, velocity ) );
M
r75  
Mr.doob 已提交
234

M
Mr.doob 已提交
235
				train.lookAt( lookAt.copy( position ).sub( tangent ) );
M
r75  
Mr.doob 已提交
236 237 238

				//

M
r86  
Mr.doob 已提交
239
				renderer.render( scene, camera );
M
r75  
Mr.doob 已提交
240

M
r85  
Mr.doob 已提交
241 242
				prevTime = time;

M
r83  
Mr.doob 已提交
243
			}
M
r75  
Mr.doob 已提交
244

M
r86  
Mr.doob 已提交
245
			renderer.animate( render );
M
r75  
Mr.doob 已提交
246 247 248 249 250

		</script>

	</body>
</html>