webxr_vr_rollercoaster.html 6.2 KB
Newer Older
M
Mr.doob 已提交
1 2
<!DOCTYPE html>
<html lang="en">
M
Mr.doob 已提交
3
	<head>
M
Mr.doob 已提交
4
		<title>three.js vr - roller coaster</title>
M
Mr.doob 已提交
5 6
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
M
Mr.doob 已提交
7
		<link type="text/css" rel="stylesheet" href="main.css">
M
Mugen87 已提交
8 9
		<!-- WebXR Device API (For Chrome M76+), expires 12/04/2019 -->
		<meta http-equiv="origin-trial" content="Aq9LklhCLNUveuCr7QTpGpqwCPG817cYHdVyQuJPOZYk47iRB390lUKa5edVmgS1pZSl8HPspElEC/91Fz55dwIAAABTeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkRldmljZU03NiIsImV4cGlyeSI6MTU3NTQxNzU5OX0=">
M
Mr.doob 已提交
10 11 12
	</head>
	<body>

13
		<script src="js/vr/HelioWebXRPolyfill.js"></script>
M
Mr.doob 已提交
14

M
Mugen87 已提交
15
		<script type="module">
16

M
Mr.doob 已提交
17
			import * as THREE from '../build/three.module.js';
M
Mugen87 已提交
18

M
Mr.doob 已提交
19 20 21 22 23 24 25
			import {
				RollerCoasterGeometry,
				RollerCoasterShadowGeometry,
				RollerCoasterLiftersGeometry,
				TreesGeometry,
				SkyGeometry
			} from './jsm/misc/RollerCoaster.js';
26
			import { VRButton } from './jsm/webxr/VRButton.js';
M
Mugen87 已提交
27

M
Mr.doob 已提交
28
			var renderer = new THREE.WebGLRenderer( { antialias: true } );
29
			renderer.setPixelRatio( window.devicePixelRatio );
M
Mr.doob 已提交
30
			renderer.setSize( window.innerWidth, window.innerHeight );
31
			renderer.vr.enabled = true;
M
Mr.doob 已提交
32 33
			document.body.appendChild( renderer.domElement );

34
			document.body.appendChild( VRButton.createButton( renderer, { referenceSpaceType: 'local' } ) );
35 36

			//
M
Mr.doob 已提交
37

M
Mr.doob 已提交
38 39
			var scene = new THREE.Scene();
			scene.background = new THREE.Color( 0xf0f0ff );
M
Mr.doob 已提交
40

M
Mr.doob 已提交
41
			var light = new THREE.HemisphereLight( 0xfff0f0, 0x606066 );
M
Mr.doob 已提交
42 43 44
			light.position.set( 1, 1, 1 );
			scene.add( light );

M
Mr.doob 已提交
45
			var train = new THREE.Object3D();
M
Mr.doob 已提交
46 47
			scene.add( train );

M
Mr.doob 已提交
48
			var camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.1, 500 );
M
Mr.doob 已提交
49 50 51 52
			train.add( camera );

			// environment

M
Mr.doob 已提交
53
			var geometry = new THREE.PlaneBufferGeometry( 500, 500, 15, 15 );
W
WestLangley 已提交
54
			geometry.rotateX( - Math.PI / 2 );
M
Mr.doob 已提交
55

M
Mr.doob 已提交
56
			var positions = geometry.attributes.position.array;
M
Mr.doob 已提交
57
			var vertex = new THREE.Vector3();
M
Mr.doob 已提交
58

M
Mr.doob 已提交
59
			for ( var i = 0; i < positions.length; i += 3 ) {
M
Mr.doob 已提交
60

M
Mr.doob 已提交
61
				vertex.fromArray( positions, i );
M
Mr.doob 已提交
62

M
Mr.doob 已提交
63 64
				vertex.x += Math.random() * 10 - 5;
				vertex.z += Math.random() * 10 - 5;
M
Mr.doob 已提交
65

M
Mr.doob 已提交
66
				var distance = ( vertex.distanceTo( scene.position ) / 5 ) - 25;
M
Mr.doob 已提交
67 68
				vertex.y = Math.random() * Math.max( 0, distance );

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

M
Mr.doob 已提交
71 72
			}

M
Mr.doob 已提交
73 74
			geometry.computeVertexNormals();

M
Mr.doob 已提交
75
			var material = new THREE.MeshLambertMaterial( {
M
Mr.doob 已提交
76 77
				color: 0x407000
			} );
M
Mr.doob 已提交
78

M
Mr.doob 已提交
79
			var mesh = new THREE.Mesh( geometry, material );
M
Mr.doob 已提交
80 81
			scene.add( mesh );

M
Mugen87 已提交
82
			var geometry = new TreesGeometry( mesh );
M
Mr.doob 已提交
83 84
			var material = new THREE.MeshBasicMaterial( {
				side: THREE.DoubleSide, vertexColors: THREE.VertexColors
M
Mr.doob 已提交
85
			} );
M
Mr.doob 已提交
86
			var mesh = new THREE.Mesh( geometry, material );
M
Mr.doob 已提交
87 88
			scene.add( mesh );

M
Mugen87 已提交
89
			var geometry = new SkyGeometry();
M
Mr.doob 已提交
90 91
			var material = new THREE.MeshBasicMaterial( { color: 0xffffff } );
			var mesh = new THREE.Mesh( geometry, material );
M
Mr.doob 已提交
92 93 94 95 96 97 98 99
			scene.add( mesh );

			//

			var PI2 = Math.PI * 2;

			var curve = ( function () {

M
Mr.doob 已提交
100 101
				var vector = new THREE.Vector3();
				var vector2 = new THREE.Vector3();
M
Mr.doob 已提交
102 103 104 105 106

				return {

					getPointAt: function ( t ) {

107
						t = t * PI2;
M
Mr.doob 已提交
108

109
						var x = Math.sin( t * 3 ) * Math.cos( t * 4 ) * 50;
M
Mr.doob 已提交
110
						var y = Math.sin( t * 10 ) * 2 + Math.cos( t * 17 ) * 2 + 5;
111
						var z = Math.sin( t ) * Math.sin( t * 4 ) * 50;
M
Mr.doob 已提交
112

M
Mr.doob 已提交
113
						return vector.set( x, y, z ).multiplyScalar( 2 );
M
Mr.doob 已提交
114 115 116 117 118 119 120 121 122

					},

					getTangentAt: function ( t ) {

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

L
Lewy Blue 已提交
123
						return vector2.copy( this.getPointAt( t2 ) )
M
Mr.doob 已提交
124
							.sub( this.getPointAt( t1 ) ).normalize();
M
Mr.doob 已提交
125 126 127 128 129 130 131

					}

				};

			} )();

M
Mugen87 已提交
132
			var geometry = new RollerCoasterGeometry( curve, 1500 );
M
Mr.doob 已提交
133 134
			var material = new THREE.MeshPhongMaterial( {
				vertexColors: THREE.VertexColors
M
Mr.doob 已提交
135
			} );
M
Mr.doob 已提交
136
			var mesh = new THREE.Mesh( geometry, material );
M
Mr.doob 已提交
137 138
			scene.add( mesh );

M
Mugen87 已提交
139
			var geometry = new RollerCoasterLiftersGeometry( curve, 100 );
M
Mr.doob 已提交
140 141
			var material = new THREE.MeshPhongMaterial();
			var mesh = new THREE.Mesh( geometry, material );
M
Mr.doob 已提交
142
			mesh.position.y = 0.1;
M
Mr.doob 已提交
143 144
			scene.add( mesh );

M
Mugen87 已提交
145
			var geometry = new RollerCoasterShadowGeometry( curve, 500 );
M
Mr.doob 已提交
146
			var material = new THREE.MeshBasicMaterial( {
M
Mr.doob 已提交
147 148
				color: 0x305000, depthWrite: false, transparent: true
			} );
M
Mr.doob 已提交
149
			var mesh = new THREE.Mesh( geometry, material );
M
Mr.doob 已提交
150
			mesh.position.y = 0.1;
M
Mr.doob 已提交
151 152 153 154 155 156
			scene.add( mesh );

			var funfairs = [];

			//

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

			funfairs.push( mesh );

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

			funfairs.push( mesh );

			//

M
Mr.doob 已提交
182 183 184
			window.addEventListener( 'resize', onWindowResize, false );

			function onWindowResize() {
M
Mr.doob 已提交
185 186 187 188

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

M
Mr.doob 已提交
189
				renderer.setSize( window.innerWidth, window.innerHeight );
M
Mr.doob 已提交
190

M
Mr.doob 已提交
191
			}
M
Mr.doob 已提交
192 193 194

			//

M
Mr.doob 已提交
195 196
			var position = new THREE.Vector3();
			var tangent = new THREE.Vector3();
M
Mr.doob 已提交
197

M
Mr.doob 已提交
198
			var lookAt = new THREE.Vector3();
M
Mr.doob 已提交
199 200 201 202

			var velocity = 0;
			var progress = 0;

M
Mr.doob 已提交
203
			var prevTime = performance.now();
204

M
Mr.doob 已提交
205
			function render() {
M
Mr.doob 已提交
206

M
Mr.doob 已提交
207
				var time = performance.now();
M
Mr.doob 已提交
208
				var delta = time - prevTime;
209

M
Mr.doob 已提交
210 211
				for ( var i = 0; i < funfairs.length; i ++ ) {

M
Mr.doob 已提交
212
					funfairs[ i ].rotation.y = time * 0.0004;
M
Mr.doob 已提交
213 214 215 216 217

				}

				//

218
				progress += velocity;
M
Mr.doob 已提交
219 220 221
				progress = progress % 1;

				position.copy( curve.getPointAt( progress ) );
M
Mr.doob 已提交
222
				position.y += 0.3;
M
Mr.doob 已提交
223 224 225 226 227

				train.position.copy( position );

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

M
Mr.doob 已提交
228
				velocity -= tangent.y * 0.0000001 * delta;
229
				velocity = Math.max( 0.00004, Math.min( 0.0002, velocity ) );
M
Mr.doob 已提交
230

M
Mugen87 已提交
231
				train.lookAt( lookAt.copy( position ).sub( tangent ) );
M
Mr.doob 已提交
232 233 234

				//

M
Mr.doob 已提交
235
				renderer.render( scene, camera );
M
Mr.doob 已提交
236

M
Mr.doob 已提交
237 238
				prevTime = time;

239
			}
M
Mr.doob 已提交
240

M
Mr.doob 已提交
241
			renderer.setAnimationLoop( render );
M
Mr.doob 已提交
242 243 244 245 246

		</script>

	</body>
</html>