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-09-11 -->
		<meta http-equiv="origin-trial" data-feature="WebVR (For Chrome M62+)" data-expires="2018-09-11" content="AqhFUYKxq/d+E8CDT0fuYRCg8TvlTP52x0Jv7I9t27sLhR30LmcahBRfSwzP89ukjs2+ia99VrrLoRyaFAwJVA0AAABQeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJWUjEuMU02MiIsImV4cGlyeSI6MTUzNjYyNDAwMH0=">
M
Mugen87 已提交
9 10 11 12
		<!-- Origin Trial Token, feature = WebXR Device API (For Chrome M69+), origin = https://threejs.org, expires = 2018-12-02 -->
		<meta http-equiv="origin-trial" data-feature="WebXR Device API (For Chrome M69+)" data-expires="2018-12-02" content="Ah46myef4Ax/+fcLtkeotXmIqnvun4lg4bYbHVttuJvbsWiE4oacrvroId7hbCEb4/byxFHIO6+uwq4pwr6RfQkAAABTeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkRldmljZU02OSIsImV4cGlyeSI6MTU0Mzc1ODIyNn0=">
		<!-- Origin Trial Token, feature = WebXR Gamepad Support, origin = https://threejs.org, expires = 2018-12-02 -->
		<meta http-equiv="origin-trial" data-feature="WebXR Gamepad Support" data-expires="2018-12-02" content="AqI9LIanbGxr/HoTOsYCUNxG82Vy94NZbjhv83R+bF+5NX2jiZOaf7ny+mFoTUP5wrWpYlPjQ6+HeVas9f1lRwYAAABYeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkdhbWVwYWRTdXBwb3J0IiwiZXhwaXJ5IjoxNTQzNzU4MjI2fQ==">
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
r75  
Mr.doob 已提交
40 41
			document.body.appendChild( renderer.domElement );

M
r94  
Mr.doob 已提交
42
			document.body.appendChild( WEBVR.createButton( renderer, { frameOfReferenceType: 'eye-level' } ) );
M
r88  
Mr.doob 已提交
43 44

			//
M
r86  
Mr.doob 已提交
45

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

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

			// environment

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

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

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

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

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

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

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

M
r75  
Mr.doob 已提交
79 80
			}

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

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

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

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

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

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

					},

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

					}

				};

			} )();

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

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

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

			var funfairs = [];

			//

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

			funfairs.push( mesh );

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

			funfairs.push( mesh );

			//

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

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

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

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

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

			//

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

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

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

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

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

				}

				//

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

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

				train.position.copy( position );

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

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

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

				//

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

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

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

M
r93  
Mr.doob 已提交
249
			renderer.setAnimationLoop( render );
M
r75  
Mr.doob 已提交
250 251 252 253 254

		</script>

	</body>
</html>