webvr_rollercoaster.html 7.1 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 = 2018-06-19 -->
		<meta http-equiv="origin-trial" data-feature="WebVR (For Chrome M62+)" data-expires="2018-06-19" content="Alxt96tYGgIr9l6EXU0eeI360zcmzOY6Kuo3kcTfBGIRDOQbgFIZKRQ1joExQ74WZr1einsE+cUMHgSclNHCQQ4AAABQeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJWUjEuMU02MiIsImV4cGlyeSI6MTUyOTM5NzgyOH0=">
M
Mugen87 已提交
9 10 11 12
		<!-- Origin Trial Token, feature = WebXR Device API, origin = https://threejs.org, expires = 2018-06-15 -->
		<meta http-equiv="origin-trial" data-feature="WebXR Device API" data-expires="2018-06-15" content="AtJH9g6nn0B87bnjJt+9m1joZXEYDmLSlRvtMr5qJD52hMcm3S86S7jg5I7y2I5cgQglE0rzsXzti5DECQLb8QkAAABQeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkRldmljZSIsImV4cGlyeSI6MTUyOTA4NDY2OH0=">
		<!-- Origin Trial Token, feature = WebXR Gamepad Support, origin = https://threejs.org, expires = 2018-06-15 -->
		<meta http-equiv="origin-trial" data-feature="WebXR Gamepad Support" data-expires="2018-06-15" content="Aihhr0yXkVlCKF0DIpTbH8WX7ZmEexUhI/95+t8aoLfvBkePMiZ/iOoDPU3xefyfuczkDahH1L6eiPvRsuzITAAAAABYeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkdhbWVwYWRTdXBwb3J0IiwiZXhwaXJ5IjoxNTI5MDg0NjY4fQ==">
M
r75  
Mr.doob 已提交
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
		<style>
			body {
				margin: 0px;
				color: #fff;
				font-family: Monospace;
				background-color: #444;
				overflow: hidden;
			}
			a {
				color: #00f;
			}
		</style>
	</head>
	<body>

M
r76  
Mr.doob 已提交
28
		<script src="../build/three.js"></script>
M
r75  
Mr.doob 已提交
29 30 31

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

M
r82  
Mr.doob 已提交
32
		<script src="js/vr/WebVR.js"></script>
M
r75  
Mr.doob 已提交
33 34 35 36 37 38

		<script>

			var renderer = new THREE.WebGLRenderer( { antialias: true } );
			renderer.setPixelRatio( window.devicePixelRatio );
			renderer.setSize( window.innerWidth, window.innerHeight );
M
r88  
Mr.doob 已提交
39
			renderer.vr.enabled = true;
M
r91  
Mr.doob 已提交
40
			renderer.vr.userHeight = 0; // TOFIX
M
r75  
Mr.doob 已提交
41 42
			document.body.appendChild( renderer.domElement );

M
r88  
Mr.doob 已提交
43 44 45
			document.body.appendChild( WEBVR.createButton( renderer ) );

			//
M
r86  
Mr.doob 已提交
46

M
r75  
Mr.doob 已提交
47
			var scene = new THREE.Scene();
M
r87  
Mr.doob 已提交
48
			scene.background = new THREE.Color( 0xf0f0ff );
M
r75  
Mr.doob 已提交
49 50 51 52 53 54 55 56

			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 已提交
57
			var camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 0.1, 500 );
M
r75  
Mr.doob 已提交
58 59 60 61
			train.add( camera );

			// environment

M
r85  
Mr.doob 已提交
62
			var geometry = new THREE.PlaneBufferGeometry( 500, 500, 15, 15 );
M
r89  
Mr.doob 已提交
63
			geometry.rotateX( - Math.PI / 2 );
M
r75  
Mr.doob 已提交
64

M
r85  
Mr.doob 已提交
65 66
			var positions = geometry.attributes.position.array;
			var vertex = new THREE.Vector3();
M
r75  
Mr.doob 已提交
67

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

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

M
r85  
Mr.doob 已提交
72 73
				vertex.x += Math.random() * 10 - 5;
				vertex.z += Math.random() * 10 - 5;
M
r75  
Mr.doob 已提交
74

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

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

M
r75  
Mr.doob 已提交
80 81
			}

M
r85  
Mr.doob 已提交
82 83 84 85 86
			geometry.computeVertexNormals();

			var material = new THREE.MeshLambertMaterial( {
				color: 0x407000
			} );
M
r75  
Mr.doob 已提交
87 88 89 90 91

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

			var geometry = new TreesGeometry( mesh );
M
r85  
Mr.doob 已提交
92 93 94
			var material = new THREE.MeshBasicMaterial( {
				side: THREE.DoubleSide, vertexColors: THREE.VertexColors
			} );
M
r75  
Mr.doob 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
			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 已提交
116
						t = t * PI2;
M
r75  
Mr.doob 已提交
117

M
r85  
Mr.doob 已提交
118 119 120
						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 已提交
121

M
r85  
Mr.doob 已提交
122
						return vector.set( x, y, z ).multiplyScalar( 2 );
M
r75  
Mr.doob 已提交
123 124 125 126 127 128 129 130 131

					},

					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 已提交
132 133
						return vector2.copy( this.getPointAt ( t2 ) )
							.sub( this.getPointAt( t1 ) ).normalize();
M
r75  
Mr.doob 已提交
134 135 136 137 138 139 140 141

					}

				};

			} )();

			var geometry = new RollerCoasterGeometry( curve, 1500 );
M
r85  
Mr.doob 已提交
142
			var material = new THREE.MeshPhongMaterial( {
M
r75  
Mr.doob 已提交
143 144 145 146 147 148
				vertexColors: THREE.VertexColors
			} );
			var mesh = new THREE.Mesh( geometry, material );
			scene.add( mesh );

			var geometry = new RollerCoasterLiftersGeometry( curve, 100 );
M
r85  
Mr.doob 已提交
149
			var material = new THREE.MeshPhongMaterial();
M
r75  
Mr.doob 已提交
150
			var mesh = new THREE.Mesh( geometry, material );
M
r85  
Mr.doob 已提交
151
			mesh.position.y = 0.1;
M
r75  
Mr.doob 已提交
152 153 154
			scene.add( mesh );

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

			var funfairs = [];

			//

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

			funfairs.push( mesh );

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

			funfairs.push( mesh );

			//

M
r86  
Mr.doob 已提交
191 192 193
			window.addEventListener( 'resize', onWindowResize, false );

			function onWindowResize() {
M
r75  
Mr.doob 已提交
194 195 196 197

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

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

M
r86  
Mr.doob 已提交
200
			}
M
r75  
Mr.doob 已提交
201 202 203 204 205 206 207 208 209 210 211

			//

			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 已提交
212
			var prevTime = performance.now();
M
r79  
Mr.doob 已提交
213

M
r86  
Mr.doob 已提交
214
			function render() {
M
r79  
Mr.doob 已提交
215

M
r86  
Mr.doob 已提交
216
				var time = performance.now();
M
r85  
Mr.doob 已提交
217
				var delta = time - prevTime;
M
r75  
Mr.doob 已提交
218 219 220

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

M
r85  
Mr.doob 已提交
221
					funfairs[ i ].rotation.y = time * 0.0004;
M
r75  
Mr.doob 已提交
222 223 224 225 226

				}

				//

M
r85  
Mr.doob 已提交
227
				progress += velocity;
M
r75  
Mr.doob 已提交
228 229 230
				progress = progress % 1;

				position.copy( curve.getPointAt( progress ) );
M
r85  
Mr.doob 已提交
231
				position.y += 0.3;
M
r75  
Mr.doob 已提交
232 233 234 235 236

				train.position.copy( position );

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

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

M
Mr.doob 已提交
240
				train.lookAt( lookAt.copy( position ).sub( tangent ) );
M
r75  
Mr.doob 已提交
241 242 243

				//

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

M
r85  
Mr.doob 已提交
246 247
				prevTime = time;

M
r83  
Mr.doob 已提交
248
			}
M
r75  
Mr.doob 已提交
249

M
r86  
Mr.doob 已提交
250
			renderer.animate( render );
M
r75  
Mr.doob 已提交
251 252 253 254 255

		</script>

	</body>
</html>