webxr_vr_ballshooter.html 6.7 KB
Newer Older
M
Mugen87 已提交
1 2 3
<!DOCTYPE html>
<html lang="en">
	<head>
M
Mr.doob 已提交
4
		<title>three.js vr - ball shooter</title>
M
Mugen87 已提交
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
Mugen87 已提交
10 11 12
	</head>
	<body>

M
Mr.doob 已提交
13
		<div id="info">
M
Mr.doob 已提交
14
			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - ball shooter
M
Mr.doob 已提交
15 16
		</div>

17
		<script src="js/vr/HelioWebXRPolyfill.js"></script>
M
Mugen87 已提交
18

M
Mugen87 已提交
19
		<script type="module">
20

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

			import { BoxLineGeometry } from './jsm/geometries/BoxLineGeometry.js';
24
			import { VRButton } from './jsm/webxr/VRButton.js';
M
Mugen87 已提交
25

M
Mr.doob 已提交
26
			var camera, scene, renderer;
27
			var controller1, controller2;
M
Mugen87 已提交
28 29 30

			var room;

31
			var count = 0;
32
			var radius = 0.08;
M
Mr.doob 已提交
33 34
			var normal = new THREE.Vector3();
			var relativeVelocity = new THREE.Vector3();
35

M
Mr.doob 已提交
36
			var clock = new THREE.Clock();
37

M
Mugen87 已提交
38
			init();
M
Mr.doob 已提交
39
			animate();
M
Mugen87 已提交
40 41 42

			function init() {

M
Mr.doob 已提交
43 44
				scene = new THREE.Scene();
				scene.background = new THREE.Color( 0x505050 );
M
Mugen87 已提交
45

M
Mr.doob 已提交
46 47
				camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.1, 10 );
				camera.position.set( 0, 1.6, 3 );
M
Mugen87 已提交
48

M
Mr.doob 已提交
49
				room = new THREE.LineSegments(
M
Mugen87 已提交
50
					new BoxLineGeometry( 6, 6, 6, 10, 10, 10 ),
M
Mr.doob 已提交
51
					new THREE.LineBasicMaterial( { color: 0x808080 } )
M
Mugen87 已提交
52
				);
M
Mr.doob 已提交
53
				room.geometry.translate( 0, 3, 0 );
M
Mugen87 已提交
54 55
				scene.add( room );

M
Mr.doob 已提交
56
				var light = new THREE.HemisphereLight( 0xffffff, 0x444444 );
57
				light.position.set( 1, 1, 1 );
M
Mugen87 已提交
58 59
				scene.add( light );

M
Mr.doob 已提交
60
				var geometry = new THREE.IcosahedronBufferGeometry( radius, 2 );
M
Mugen87 已提交
61 62 63

				for ( var i = 0; i < 200; i ++ ) {

M
Mr.doob 已提交
64
					var object = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff } ) );
M
Mugen87 已提交
65 66

					object.position.x = Math.random() * 4 - 2;
M
Mr.doob 已提交
67
					object.position.y = Math.random() * 4;
M
Mugen87 已提交
68 69
					object.position.z = Math.random() * 4 - 2;

M
Mr.doob 已提交
70
					object.userData.velocity = new THREE.Vector3();
M
Mugen87 已提交
71 72 73 74 75 76 77 78 79 80
					object.userData.velocity.x = Math.random() * 0.01 - 0.005;
					object.userData.velocity.y = Math.random() * 0.01 - 0.005;
					object.userData.velocity.z = Math.random() * 0.01 - 0.005;

					room.add( object );

				}

				//

M
Mr.doob 已提交
81
				renderer = new THREE.WebGLRenderer( { antialias: true } );
M
Mugen87 已提交
82 83
				renderer.setPixelRatio( window.devicePixelRatio );
				renderer.setSize( window.innerWidth, window.innerHeight );
M
Mr.doob 已提交
84
				renderer.vr.enabled = true;
M
Mr.doob 已提交
85
				document.body.appendChild( renderer.domElement );
M
Mugen87 已提交
86

M
Mr.doob 已提交
87
				//
88

89
				document.body.appendChild( VRButton.createButton( renderer ) );
M
Mugen87 已提交
90

91
				// controllers
M
Mugen87 已提交
92

93
				function onSelectStart() {
94

95
					this.userData.isSelecting = true;
96

97
				}
98

99
				function onSelectEnd() {
100

101
					this.userData.isSelecting = false;
M
Mugen87 已提交
102

103 104 105 106 107 108 109 110 111 112 113 114 115 116
				}

				controller1 = renderer.vr.getController( 0 );
				controller1.addEventListener( 'selectstart', onSelectStart );
				controller1.addEventListener( 'selectend', onSelectEnd );
				scene.add( controller1 );

				controller2 = renderer.vr.getController( 1 );
				controller2.addEventListener( 'selectstart', onSelectStart );
				controller2.addEventListener( 'selectend', onSelectEnd );
				scene.add( controller2 );

				// helpers

M
Mr.doob 已提交
117
				var geometry = new THREE.BufferGeometry();
118 119
				geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0, 0, 0, - 1 ], 3 ) );
				geometry.setAttribute( 'color', new THREE.Float32BufferAttribute( [ 0.5, 0.5, 0.5, 0, 0, 0 ], 3 ) );
M
Mugen87 已提交
120

M
Mr.doob 已提交
121
				var material = new THREE.LineBasicMaterial( { vertexColors: true, blending: THREE.AdditiveBlending } );
122

M
Mr.doob 已提交
123 124
				controller1.add( new THREE.Line( geometry, material ) );
				controller2.add( new THREE.Line( geometry, material ) );
M
Mugen87 已提交
125 126 127 128 129 130 131 132 133 134 135 136

				//

				window.addEventListener( 'resize', onWindowResize, false );

			}

			function onWindowResize() {

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

M
Mr.doob 已提交
137
				renderer.setSize( window.innerWidth, window.innerHeight );
M
Mugen87 已提交
138 139 140

			}

141
			function handleController( controller ) {
M
Mr.doob 已提交
142

143
				if ( controller.userData.isSelecting ) {
M
Mr.doob 已提交
144

145
					var object = room.children[ count ++ ];
M
Mr.doob 已提交
146

M
Mr.doob 已提交
147
					object.position.copy( controller.position );
148 149 150
					object.userData.velocity.x = ( Math.random() - 0.5 ) * 3;
					object.userData.velocity.y = ( Math.random() - 0.5 ) * 3;
					object.userData.velocity.z = ( Math.random() - 9 );
M
Mr.doob 已提交
151 152
					object.userData.velocity.applyQuaternion( controller.quaternion );

153
					if ( count === room.children.length ) count = 0;
M
Mr.doob 已提交
154 155 156

				}

157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
			}

			//

			function animate() {

				renderer.setAnimationLoop( render );

			}

			function render() {

				handleController( controller1 );
				handleController( controller2 );

172
				//
M
Mugen87 已提交
173

M
Mr.doob 已提交
174
				var delta = clock.getDelta() * 0.8; // slow down simulation
175

176
				var range = 3 - radius;
M
Mr.doob 已提交
177

M
Mugen87 已提交
178 179
				for ( var i = 0; i < room.children.length; i ++ ) {

180 181
					var object = room.children[ i ];

182 183 184
					object.position.x += object.userData.velocity.x * delta;
					object.position.y += object.userData.velocity.y * delta;
					object.position.z += object.userData.velocity.z * delta;
M
Mugen87 已提交
185

186
					// keep objects inside room
M
Mugen87 已提交
187

188
					if ( object.position.x < - range || object.position.x > range ) {
M
Mugen87 已提交
189

M
Mr.doob 已提交
190
						object.position.x = THREE.Math.clamp( object.position.x, - range, range );
191
						object.userData.velocity.x = - object.userData.velocity.x;
M
Mugen87 已提交
192 193 194

					}

195
					if ( object.position.y < radius || object.position.y > 6 ) {
M
Mr.doob 已提交
196

197
						object.position.y = Math.max( object.position.y, radius );
M
Mugen87 已提交
198

199
						object.userData.velocity.x *= 0.98;
200
						object.userData.velocity.y = - object.userData.velocity.y * 0.8;
201
						object.userData.velocity.z *= 0.98;
M
Mugen87 已提交
202 203 204

					}

205
					if ( object.position.z < - range || object.position.z > range ) {
M
Mugen87 已提交
206

M
Mr.doob 已提交
207
						object.position.z = THREE.Math.clamp( object.position.z, - range, range );
208
						object.userData.velocity.z = - object.userData.velocity.z;
M
Mugen87 已提交
209 210 211

					}

212 213
					for ( var j = i + 1; j < room.children.length; j ++ ) {

214
						var object2 = room.children[ j ];
215

216
						normal.copy( object.position ).sub( object2.position );
217

218 219 220 221 222
						var distance = normal.length();

						if ( distance < 2 * radius ) {

							normal.multiplyScalar( 0.5 * distance - radius );
223

224 225
							object.position.sub( normal );
							object2.position.add( normal );
226 227 228

							normal.normalize();

229
							relativeVelocity.copy( object.userData.velocity ).sub( object2.userData.velocity );
230

231
							normal = normal.multiplyScalar( relativeVelocity.dot( normal ) );
232

233 234
							object.userData.velocity.sub( normal );
							object2.userData.velocity.add( normal );
235 236 237 238 239

						}

					}

240 241
					object.userData.velocity.y -= 9.8 * delta;

M
Mugen87 已提交
242 243
				}

M
Mr.doob 已提交
244
				renderer.render( scene, camera );
M
Mugen87 已提交
245 246 247 248 249 250

			}

		</script>
	</body>
</html>