Forráskód Böngészése

Examples: Updated webxr_ar_hittest to latest version of the spec.

Mr.doob 5 éve
szülő
commit
ad2606b139
2 módosított fájl, 29 hozzáadás és 26 törlés
  1. 2 2
      examples/jsm/webxr/ARButton.js
  2. 27 24
      examples/webxr_ar_hittest.html

+ 2 - 2
examples/jsm/webxr/ARButton.js

@@ -5,7 +5,7 @@
 
 
 var ARButton = {
 var ARButton = {
 
 
-	createButton: function ( renderer ) {
+	createButton: function ( renderer, sessionInit = {} ) {
 
 
 		function showStartAR( /*device*/ ) {
 		function showStartAR( /*device*/ ) {
 
 
@@ -65,7 +65,7 @@ var ARButton = {
 
 
 				if ( currentSession === null ) {
 				if ( currentSession === null ) {
 
 
-					navigator.xr.requestSession( 'immersive-ar' ).then( onSessionStarted );
+					navigator.xr.requestSession( 'immersive-ar', sessionInit ).then( onSessionStarted );
 
 
 				} else {
 				} else {
 
 

+ 27 - 24
examples/webxr_ar_hittest.html

@@ -9,7 +9,7 @@
 	<body>
 	<body>
 
 
 		<div id="info">
 		<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 Android 80+)
+			<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 Android 81+)
 		</div>
 		</div>
 
 
 		<script type="module">
 		<script type="module">
@@ -21,7 +21,10 @@
 			var camera, scene, renderer;
 			var camera, scene, renderer;
 			var controller;
 			var controller;
 
 
-			var matrix, ray, reticle;
+			var reticle;
+
+			var hitTestSource;
+			var hitTestSourceRequested = false;
 
 
 			init();
 			init();
 			animate();
 			animate();
@@ -49,7 +52,7 @@
 
 
 				//
 				//
 
 
-				document.body.appendChild( ARButton.createButton( renderer ) );
+				document.body.appendChild( ARButton.createButton( renderer, { requiredFeatures: [ 'hit-test' ] } ) );
 
 
 				//
 				//
 
 
@@ -73,10 +76,6 @@
 				controller.addEventListener( 'select', onSelect );
 				controller.addEventListener( 'select', onSelect );
 				scene.add( controller );
 				scene.add( controller );
 
 
-				matrix = new THREE.Matrix4();
-
-				ray = new THREE.Ray();
-
 				reticle = new THREE.Mesh(
 				reticle = new THREE.Mesh(
 					new THREE.RingBufferGeometry( 0.15, 0.2, 32 ).rotateX( - Math.PI / 2 ),
 					new THREE.RingBufferGeometry( 0.15, 0.2, 32 ).rotateX( - Math.PI / 2 ),
 					new THREE.MeshBasicMaterial()
 					new THREE.MeshBasicMaterial()
@@ -114,35 +113,39 @@
 
 
 					var referenceSpace = renderer.xr.getReferenceSpace();
 					var referenceSpace = renderer.xr.getReferenceSpace();
 					var session = renderer.xr.getSession();
 					var session = renderer.xr.getSession();
-					var pose = frame.getViewerPose( referenceSpace );
 
 
-					if ( pose ) {
+					if ( hitTestSourceRequested === false ) {
+
+						session.requestReferenceSpace( 'viewer' ).then( function ( referenceSpace ) {
+
+							session.requestHitTestSource( { space: referenceSpace } ).then( function ( source ) {
 
 
-						matrix.fromArray( pose.transform.matrix );
+								hitTestSource = source;
 
 
-						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 ) {
+						hitTestSourceRequested = true;
 
 
-								if ( results.length ) {
+					}
 
 
-									var hitResult = results[ 0 ];
+					if ( hitTestSource ) {
 
 
-									reticle.visible = true;
-									reticle.matrix.fromArray( hitResult.hitMatrix );
+						var hitTestResults = frame.getHitTestResults( hitTestSource );
 
 
-								} else {
+						if ( hitTestResults.length ) {
 
 
-									reticle.visible = false;
+							var hit = hitTestResults[ 0 ];
 
 
-								}
+							reticle.visible = true;
+							reticle.matrix.fromArray( hit.getPose( referenceSpace ).transform.matrix );
 
 
-							} );
+						} else {
+
+							reticle.visible = false;
+
+						}
 
 
 					}
 					}