From 571ac06e173ac812dbdc78daff398c70b0e038b8 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Thu, 11 May 2023 18:19:39 +0900 Subject: [PATCH 1/6] WebXRManager: Removed getCamera() and added setCamera(). --- examples/webxr_vr_rollercoaster.html | 19 ++++++++++--------- src/renderers/WebGLRenderer.js | 4 +--- src/renderers/webxr/WebXRManager.js | 19 +++++++++++-------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/examples/webxr_vr_rollercoaster.html b/examples/webxr_vr_rollercoaster.html index 042618632fa432..d18fdc1da121bb 100644 --- a/examples/webxr_vr_rollercoaster.html +++ b/examples/webxr_vr_rollercoaster.html @@ -35,15 +35,6 @@ let mesh, material, geometry; - const renderer = new THREE.WebGLRenderer( { antialias: true } ); - renderer.setPixelRatio( window.devicePixelRatio ); - renderer.setSize( window.innerWidth, window.innerHeight ); - renderer.xr.enabled = true; - renderer.xr.setReferenceSpaceType( 'local' ); - document.body.appendChild( renderer.domElement ); - - document.body.appendChild( VRButton.createButton( renderer ) ); - // const scene = new THREE.Scene(); @@ -188,6 +179,16 @@ // + const renderer = new THREE.WebGLRenderer( { antialias: true } ); + renderer.setPixelRatio( window.devicePixelRatio ); + renderer.setSize( window.innerWidth, window.innerHeight ); + renderer.xr.enabled = true; + renderer.xr.setCamera( camera ); + renderer.xr.setReferenceSpaceType( 'local' ); + document.body.appendChild( renderer.domElement ); + + document.body.appendChild( VRButton.createButton( renderer ) ); + window.addEventListener( 'resize', onWindowResize ); function onWindowResize() { diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 16386c72af3581..c7a880ba2d0f60 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1048,9 +1048,7 @@ class WebGLRenderer { if ( xr.enabled === true && xr.isPresenting === true ) { - if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera ); - - camera = xr.getCamera(); // use XR camera for rendering + camera = xr.updateCamera(); // use XR camera for rendering } diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index c4adaa7e437a72..8b86f94906961b 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -45,6 +45,8 @@ class WebXRManager extends EventDispatcher { // + let camera = new PerspectiveCamera(); + const cameraL = new PerspectiveCamera(); cameraL.layers.enable( 1 ); cameraL.viewport = new Vector4(); @@ -64,11 +66,16 @@ class WebXRManager extends EventDispatcher { // - this.cameraAutoUpdate = true; this.enabled = false; this.isPresenting = false; + this.setCamera = function ( value ) { + + camera = value; + + }; + this.getController = function ( index ) { let controller = controllers[ index ]; @@ -505,7 +512,7 @@ class WebXRManager extends EventDispatcher { } - this.updateCamera = function ( camera ) { + this.updateCamera = function () { if ( session === null ) return; @@ -555,6 +562,8 @@ class WebXRManager extends EventDispatcher { updateUserCamera( camera, cameraVR, parent ); + return cameraVR; + }; function updateUserCamera( camera, cameraVR, parent ) { @@ -592,12 +601,6 @@ class WebXRManager extends EventDispatcher { } - } - - this.getCamera = function () { - - return cameraVR; - }; this.getFoveation = function () { From d2f558109e84b2a15e970f71f1b0dbd66b70d5ca Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Thu, 11 May 2023 18:39:17 +0900 Subject: [PATCH 2/6] Make sure cameraVR updates near and far. --- src/renderers/WebGLRenderer.js | 2 +- src/renderers/webxr/WebXRManager.js | 26 +++++++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index c7a880ba2d0f60..83557f36d84d05 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1048,7 +1048,7 @@ class WebGLRenderer { if ( xr.enabled === true && xr.isPresenting === true ) { - camera = xr.updateCamera(); // use XR camera for rendering + camera = xr.updateCamera( camera ); // use XR camera for rendering } diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index 8b86f94906961b..4ae4a71f0e437e 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -45,7 +45,7 @@ class WebXRManager extends EventDispatcher { // - let camera = new PerspectiveCamera(); + let userCamera = null; const cameraL = new PerspectiveCamera(); cameraL.layers.enable( 1 ); @@ -72,7 +72,7 @@ class WebXRManager extends EventDispatcher { this.setCamera = function ( value ) { - camera = value; + userCamera = value; }; @@ -512,9 +512,15 @@ class WebXRManager extends EventDispatcher { } - this.updateCamera = function () { + this.updateCamera = function ( camera ) { - if ( session === null ) return; + if ( session === null ) return camera; + + if ( userCamera ) { + + camera = userCamera; + + } cameraVR.near = cameraR.near = cameraL.near = camera.near; cameraVR.far = cameraR.far = cameraL.far = camera.far; @@ -560,13 +566,19 @@ class WebXRManager extends EventDispatcher { // update user camera and its children - updateUserCamera( camera, cameraVR, parent ); + if ( userCamera ) { + + updateUserCamera( cameraVR, parent ); + + } return cameraVR; }; - function updateUserCamera( camera, cameraVR, parent ) { + function updateUserCamera( cameraVR, parent ) { + + const camera = userCamera; if ( parent === null ) { @@ -601,7 +613,7 @@ class WebXRManager extends EventDispatcher { } - }; + } this.getFoveation = function () { From faa939ca9fe77e74490d69b6a3f496f717f50526 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Thu, 11 May 2023 18:45:52 +0900 Subject: [PATCH 3/6] WebXRManager: Renamed cameraVR to cameraXR. --- src/renderers/WebGLRenderer.js | 2 +- src/renderers/webxr/WebXRManager.js | 62 ++++++++++++++--------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 83557f36d84d05..eca83aeca58b80 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1048,7 +1048,7 @@ class WebGLRenderer { if ( xr.enabled === true && xr.isPresenting === true ) { - camera = xr.updateCamera( camera ); // use XR camera for rendering + camera = xr.updateCameraXR( camera ); // use XR camera for rendering } diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index 4ae4a71f0e437e..f1402c4b513c81 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -57,9 +57,9 @@ class WebXRManager extends EventDispatcher { const cameras = [ cameraL, cameraR ]; - const cameraVR = new ArrayCamera(); - cameraVR.layers.enable( 1 ); - cameraVR.layers.enable( 2 ); + const cameraXR = new ArrayCamera(); + cameraXR.layers.enable( 1 ); + cameraXR.layers.enable( 2 ); let _currentDepthNear = null; let _currentDepthFar = null; @@ -512,7 +512,7 @@ class WebXRManager extends EventDispatcher { } - this.updateCamera = function ( camera ) { + this.updateCameraXR = function ( camera ) { if ( session === null ) return camera; @@ -522,27 +522,27 @@ class WebXRManager extends EventDispatcher { } - cameraVR.near = cameraR.near = cameraL.near = camera.near; - cameraVR.far = cameraR.far = cameraL.far = camera.far; + cameraXR.near = cameraR.near = cameraL.near = camera.near; + cameraXR.far = cameraR.far = cameraL.far = camera.far; - if ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) { + if ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) { // Note that the new renderState won't apply until the next frame. See #18320 session.updateRenderState( { - depthNear: cameraVR.near, - depthFar: cameraVR.far + depthNear: cameraXR.near, + depthFar: cameraXR.far } ); - _currentDepthNear = cameraVR.near; - _currentDepthFar = cameraVR.far; + _currentDepthNear = cameraXR.near; + _currentDepthFar = cameraXR.far; } const parent = camera.parent; - const cameras = cameraVR.cameras; + const cameras = cameraXR.cameras; - updateCamera( cameraVR, parent ); + updateCamera( cameraXR, parent ); for ( let i = 0; i < cameras.length; i ++ ) { @@ -554,13 +554,13 @@ class WebXRManager extends EventDispatcher { if ( cameras.length === 2 ) { - setProjectionFromUnion( cameraVR, cameraL, cameraR ); + setProjectionFromUnion( cameraXR, cameraL, cameraR ); } else { // assume single camera setup (AR) - cameraVR.projectionMatrix.copy( cameraL.projectionMatrix ); + cameraXR.projectionMatrix.copy( cameraL.projectionMatrix ); } @@ -568,27 +568,27 @@ class WebXRManager extends EventDispatcher { if ( userCamera ) { - updateUserCamera( cameraVR, parent ); + updateUserCamera( cameraXR, parent ); } - return cameraVR; + return cameraXR; }; - function updateUserCamera( cameraVR, parent ) { + function updateUserCamera( cameraXR, parent ) { const camera = userCamera; if ( parent === null ) { - camera.matrix.copy( cameraVR.matrixWorld ); + camera.matrix.copy( cameraXR.matrixWorld ); } else { camera.matrix.copy( parent.matrixWorld ); camera.matrix.invert(); - camera.matrix.multiply( cameraVR.matrixWorld ); + camera.matrix.multiply( cameraXR.matrixWorld ); } @@ -603,8 +603,8 @@ class WebXRManager extends EventDispatcher { } - camera.projectionMatrix.copy( cameraVR.projectionMatrix ); - camera.projectionMatrixInverse.copy( cameraVR.projectionMatrixInverse ); + camera.projectionMatrix.copy( cameraXR.projectionMatrix ); + camera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse ); if ( camera.isPerspectiveCamera ) { @@ -674,14 +674,14 @@ class WebXRManager extends EventDispatcher { } - let cameraVRNeedsUpdate = false; + let cameraXRNeedsUpdate = false; - // check if it's necessary to rebuild cameraVR's camera list + // check if it's necessary to rebuild cameraXR's camera list - if ( views.length !== cameraVR.cameras.length ) { + if ( views.length !== cameraXR.cameras.length ) { - cameraVR.cameras.length = 0; - cameraVRNeedsUpdate = true; + cameraXR.cameras.length = 0; + cameraXRNeedsUpdate = true; } @@ -733,14 +733,14 @@ class WebXRManager extends EventDispatcher { if ( i === 0 ) { - cameraVR.matrix.copy( camera.matrix ); - cameraVR.matrix.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale ); + cameraXR.matrix.copy( camera.matrix ); + cameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale ); } - if ( cameraVRNeedsUpdate === true ) { + if ( cameraXRNeedsUpdate === true ) { - cameraVR.cameras.push( camera ); + cameraXR.cameras.push( camera ); } From 4037822766e32f647ea0e050174fb62fc9be96a0 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Thu, 11 May 2023 18:52:44 +0900 Subject: [PATCH 4/6] WebXRManager: Added deprecated annotations. --- src/renderers/webxr/WebXRManager.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index f1402c4b513c81..c81b5f28cbb291 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -66,10 +66,13 @@ class WebXRManager extends EventDispatcher { // + this.cameraAutoUpdate = true; // @deprecated, r153 this.enabled = false; this.isPresenting = false; + this.getCamera = function () {}; // @deprecated, r153 + this.setCamera = function ( value ) { userCamera = value; From 7dd3d638ca0933586ebb78d53ded9b4b2f1cc537 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Thu, 11 May 2023 19:15:57 +0900 Subject: [PATCH 5/6] WebXRManager: Renamed setCamera() to setUserCamera(). --- examples/webxr_vr_rollercoaster.html | 2 +- src/renderers/webxr/WebXRManager.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/webxr_vr_rollercoaster.html b/examples/webxr_vr_rollercoaster.html index d18fdc1da121bb..a03f542061488c 100644 --- a/examples/webxr_vr_rollercoaster.html +++ b/examples/webxr_vr_rollercoaster.html @@ -183,8 +183,8 @@ renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.xr.enabled = true; - renderer.xr.setCamera( camera ); renderer.xr.setReferenceSpaceType( 'local' ); + renderer.xr.setUserCamera( camera ); document.body.appendChild( renderer.domElement ); document.body.appendChild( VRButton.createButton( renderer ) ); diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index c81b5f28cbb291..d7d85c085341d1 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -73,7 +73,7 @@ class WebXRManager extends EventDispatcher { this.getCamera = function () {}; // @deprecated, r153 - this.setCamera = function ( value ) { + this.setUserCamera = function ( value ) { userCamera = value; From 1b527327e1df0b3d8fb460eb2dcc04cdbc6bfee6 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Thu, 11 May 2023 19:16:11 +0900 Subject: [PATCH 6/6] Fixed handinput examples. --- .../webxr_vr_handinput_pointerclick.jpg | Bin 9518 -> 9695 bytes .../webxr_vr_handinput_pointerdrag.jpg | Bin 10315 -> 10572 bytes .../webxr_vr_handinput_pressbutton.jpg | Bin 9729 -> 9589 bytes examples/webxr_vr_handinput_pointerclick.html | 8 ++---- examples/webxr_vr_handinput_pointerdrag.html | 15 ++++------- examples/webxr_vr_handinput_pressbutton.html | 25 +++++++----------- 6 files changed, 17 insertions(+), 31 deletions(-) diff --git a/examples/screenshots/webxr_vr_handinput_pointerclick.jpg b/examples/screenshots/webxr_vr_handinput_pointerclick.jpg index 344b864260362ba390871e1d9838e6c145bace7f..7c2df8185e6459dce51910ad939a23fc32906ea5 100644 GIT binary patch delta 6850 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 delta 6741 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 delta 7545 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 diff --git a/examples/screenshots/webxr_vr_handinput_pressbutton.jpg b/examples/screenshots/webxr_vr_handinput_pressbutton.jpg index 03ad68f4f420e34ceec013326d9a96dbd463ac69..2f7b86f033be229e27cfa837f47433e81fd57d51 100644 GIT binary patch literal 9589 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 diff --git a/examples/webxr_vr_handinput_pointerclick.html b/examples/webxr_vr_handinput_pointerclick.html index 7e8af2e7f85f01..5ee86a9b5f903d 100644 --- a/examples/webxr_vr_handinput_pointerclick.html +++ b/examples/webxr_vr_handinput_pointerclick.html @@ -39,8 +39,6 @@ import { World, System, Component, TagComponent, Types } from 'three/addons/libs/ecsy.module.js'; - THREE.ColorManagement.enabled = false; // TODO: Consider enabling color management. - class Object3D extends Component { } Object3D.schema = { @@ -305,7 +303,7 @@ camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.1, 10 ); camera.position.set( 0, 1.2, 0.3 ); - scene.add( new THREE.HemisphereLight( 0x808080, 0x606060 ) ); + scene.add( new THREE.HemisphereLight( 0xcccccc, 0x999999 ) ); const light = new THREE.DirectionalLight( 0xffffff ); light.position.set( 0, 6, 0 ); @@ -322,8 +320,7 @@ renderer.setSize( window.innerWidth, window.innerHeight ); renderer.shadowMap.enabled = true; renderer.xr.enabled = true; - renderer.xr.cameraAutoUpdate = false; - + renderer.xr.setUserCamera( camera ); container.appendChild( renderer.domElement ); document.body.appendChild( VRButton.createButton( renderer ) ); @@ -518,7 +515,6 @@ const delta = clock.getDelta(); const elapsedTime = clock.elapsedTime; - renderer.xr.updateCamera( camera ); world.execute( delta, elapsedTime ); renderer.render( scene, camera ); diff --git a/examples/webxr_vr_handinput_pointerdrag.html b/examples/webxr_vr_handinput_pointerdrag.html index bb6ba006f1c025..f958b862c0b679 100644 --- a/examples/webxr_vr_handinput_pointerdrag.html +++ b/examples/webxr_vr_handinput_pointerdrag.html @@ -39,8 +39,6 @@ import { World, System, Component, TagComponent, Types } from 'three/addons/libs/ecsy.module.js'; - THREE.ColorManagement.enabled = false; // TODO: Consider enabling color management. - class Object3D extends Component { } Object3D.schema = { @@ -312,10 +310,9 @@ const offset = entity.getComponent( OffsetFromCamera ); const object = entity.getComponent( Object3D ).object; - const xrCamera = this.renderer.xr.getCamera(); - object.position.x = xrCamera.position.x + offset.x; - object.position.y = xrCamera.position.y + offset.y; - object.position.z = xrCamera.position.z + offset.z; + object.position.x = camera.position.x + offset.x; + object.position.y = camera.position.y + offset.y; + object.position.z = camera.position.z + offset.z; entity.removeComponent( NeedCalibration ); } @@ -408,7 +405,7 @@ camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.1, 10 ); camera.position.set( 0, 1.2, 0.3 ); - scene.add( new THREE.HemisphereLight( 0x808080, 0x606060 ) ); + scene.add( new THREE.HemisphereLight( 0xcccccc, 0x999999 ) ); const light = new THREE.DirectionalLight( 0xffffff ); light.position.set( 0, 6, 0 ); @@ -425,8 +422,7 @@ renderer.setSize( window.innerWidth, window.innerHeight ); renderer.shadowMap.enabled = true; renderer.xr.enabled = true; - renderer.xr.cameraAutoUpdate = false; - + renderer.xr.setUserCamera( camera ); container.appendChild( renderer.domElement ); document.body.appendChild( VRButton.createButton( renderer ) ); @@ -596,7 +592,6 @@ const delta = clock.getDelta(); const elapsedTime = clock.elapsedTime; - renderer.xr.updateCamera( camera ); world.execute( delta, elapsedTime ); renderer.render( scene, camera ); diff --git a/examples/webxr_vr_handinput_pressbutton.html b/examples/webxr_vr_handinput_pressbutton.html index 8657858f724a14..76e397fa56259c 100644 --- a/examples/webxr_vr_handinput_pressbutton.html +++ b/examples/webxr_vr_handinput_pressbutton.html @@ -38,8 +38,6 @@ import { World, System, Component, TagComponent, Types } from 'three/addons/libs/ecsy.module.js'; - THREE.ColorManagement.enabled = false; // TODO: Consider enabling color management. - class Object3D extends Component { } Object3D.schema = { @@ -75,11 +73,6 @@ let buttonPressSound, buttonReleaseSound; if ( this.renderer.xr.getSession() && ! this.soundAdded ) { - const xrCamera = this.renderer.xr.getCamera(); - - const listener = new THREE.AudioListener(); - xrCamera.add( listener ); - // create a global audio source buttonPressSound = new THREE.Audio( listener ); buttonReleaseSound = new THREE.Audio( listener ); @@ -316,10 +309,9 @@ const offset = entity.getComponent( OffsetFromCamera ); const object = entity.getComponent( Object3D ).object; - const xrCamera = this.renderer.xr.getCamera(); - object.position.x = xrCamera.position.x + offset.x; - object.position.y = xrCamera.position.y + offset.y; - object.position.z = xrCamera.position.z + offset.z; + object.position.x = camera.position.x + offset.x; + object.position.y = camera.position.y + offset.y; + object.position.z = camera.position.z + offset.z; entity.removeComponent( NeedCalibration ); } @@ -338,7 +330,9 @@ const world = new World(); const clock = new THREE.Clock(); + let camera, scene, renderer; + let listener; init(); animate(); @@ -365,7 +359,10 @@ camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.1, 10 ); camera.position.set( 0, 1.2, 0.3 ); - scene.add( new THREE.HemisphereLight( 0x808080, 0x606060 ) ); + listener = new THREE.AudioListener(); + camera.add( listener ); + + scene.add( new THREE.HemisphereLight( 0xcccccc, 0x999999 ) ); const light = new THREE.DirectionalLight( 0xffffff ); light.position.set( 0, 6, 0 ); @@ -382,8 +379,7 @@ renderer.setSize( window.innerWidth, window.innerHeight ); renderer.shadowMap.enabled = true; renderer.xr.enabled = true; - renderer.xr.cameraAutoUpdate = false; - + renderer.xr.setUserCamera( camera ); container.appendChild( renderer.domElement ); document.body.appendChild( VRButton.createButton( renderer ) ); @@ -575,7 +571,6 @@ const delta = clock.getDelta(); const elapsedTime = clock.elapsedTime; - renderer.xr.updateCamera( camera ); world.execute( delta, elapsedTime ); renderer.render( scene, camera );