Selaa lähdekoodia

Examples: Added WebXR Hit Test example.

Mr.doob 5 vuotta sitten
vanhempi
commit
6429ba6cfd
2 muutettua tiedostoa jossa 156 lisäystä ja 0 poistoa
  1. 1 0
      examples/files.js
  2. 155 0
      examples/webxr_ar_hittest.html

+ 1 - 0
examples/files.js

@@ -319,6 +319,7 @@ var files = {
 		"webaudio_visualizer"
 	],
 	"webxr": [
+		"webxr_ar_hittest",
 		"webxr_ar_paint",
 		"webxr_vr_ballshooter",
 		"webxr_vr_cubes",

+ 155 - 0
examples/webxr_ar_hittest.html

@@ -0,0 +1,155 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>three.js ar - hit test</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
+		<link type="text/css" rel="stylesheet" href="main.css">
+	</head>
+	<body>
+
+		<div id="info">
+			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> ar - hit test<br/>Enable chrome://flags/#webxr-ar-module<br/>Enable chrome://flags/#webxr-hit-test<br/>(Chrome 80+)
+		</div>
+
+		<script type="module">
+
+			import * as THREE from '../build/three.module.js';
+			import { ARButton } from './jsm/webxr/ARButton.js';
+
+			var container;
+			var camera, scene, renderer;
+			var controller;
+
+			var matrix, ray, reticle;
+
+			init();
+			animate();
+
+			function init() {
+
+				container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				scene = new THREE.Scene();
+
+				camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.01, 20 );
+
+				var light = new THREE.HemisphereLight( 0xffffff, 0xbbbbff, 1 );
+				light.position.set( 0.5, 1, 0.25 );
+				scene.add( light );
+
+				//
+
+				renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } );
+				renderer.setPixelRatio( window.devicePixelRatio );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.xr.enabled = true;
+				container.appendChild( renderer.domElement );
+
+				//
+
+				document.body.appendChild( ARButton.createButton( renderer ) );
+
+				//
+
+				function onSelect() {
+
+					if ( reticle.visible ) {
+
+						var geometry = new THREE.BoxBufferGeometry( 0.2, 0.2, 0.2 ).translate( 0, 0.1, 0 );
+						var material = new THREE.MeshPhongMaterial( { color: 0xffffff * Math.random() } );
+						var mesh = new THREE.Mesh( geometry, material );
+						mesh.position.setFromMatrixPosition( reticle.matrix );
+						scene.add( mesh );
+
+					}
+
+				}
+
+				controller = renderer.xr.getController( 0 );
+				controller.addEventListener( 'select', onSelect );
+				scene.add( controller );
+
+				matrix = new THREE.Matrix4();
+
+				ray = new THREE.Ray();
+
+				var geometry = new THREE.RingBufferGeometry( 0.15, 0.2, 32 ).rotateX( - Math.PI / 2 );
+				var material = new THREE.MeshBasicMaterial();
+
+				reticle = new THREE.Mesh( geometry, material );
+				reticle.matrixAutoUpdate = false;
+				reticle.visible = false;
+				scene.add( reticle );
+
+				//
+
+				window.addEventListener( 'resize', onWindowResize, false );
+
+			}
+
+			function onWindowResize() {
+
+				camera.aspect = window.innerWidth / window.innerHeight;
+				camera.updateProjectionMatrix();
+
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+			}
+
+			//
+
+			function animate() {
+
+				renderer.setAnimationLoop( render );
+
+			}
+
+			function render( timestamp, frame ) {
+
+				if ( frame ) {
+
+					var referenceSpace = renderer.xr.getReferenceSpace();
+					var session = renderer.xr.getSession();
+					var pose = frame.getViewerPose( referenceSpace );
+
+					if ( pose ) {
+
+						matrix.fromArray( pose.transform.matrix );
+
+						ray.origin.set( 0, 0, 0 );
+						ray.direction.set( 0, 0, - 1 );
+						ray.applyMatrix4( matrix );
+
+						var xrRay = new XRRay( ray.origin, ray.direction );
+
+						session.requestHitTest( xrRay, referenceSpace )
+							.then( function ( results ) {
+
+								if ( results.length ) {
+
+									var hitResult = results[ 0 ];
+
+									reticle.visible = true;
+									reticle.matrix.fromArray( hitResult.hitMatrix );
+
+								} else {
+
+									reticle.visible = false;
+
+								}
+
+							} );
+
+					}
+
+				}
+
+				renderer.render( scene, camera );
+
+			}
+
+		</script>
+	</body>
+</html>