Browse Source

floor-enabled teleportation

Raanan Weber 5 năm trước cách đây
mục cha
commit
46b9e06aa0
1 tập tin đã thay đổi với 12 bổ sung6 xóa
  1. 12 6
      src/XR/features/WebXRControllerTeleportation.ts

+ 12 - 6
src/XR/features/WebXRControllerTeleportation.ts

@@ -267,18 +267,24 @@ export class WebXRMotionControllerTeleportation extends WebXRAbstractFeature {
                 let hitPossible = false;
                 // first check if direct ray possible
                 controllerData.xrController.getWorldPointerRayToRef(this._tmpRay);
+                // pick grounds that are LOWER only. upper will use parabolic path
                 let pick = scene.pickWithRay(this._tmpRay, (o) => {
-                    return this._floorMeshes.indexOf(o) !== -1;
+                    const index = this._floorMeshes.indexOf(o);
+                    if (index === -1) { return false; }
+                    return (this._floorMeshes[index].absolutePosition.y < this._options.xrInput.xrCamera.position.y);
                 });
                 if (pick && pick.pickedPoint) {
                     hitPossible = true;
                     this.setTargetMeshPosition(pick.pickedPoint);
                     this.setTargetMeshVisibility(true);
-                    this.showParabolicPath(pick);
+                    this._showParabolicPath(pick);
                 } else {
                     if (this.parabolicRayEnabled) {
+                        // radius compensation according to pointer rotation around X
+                        const xRotation = controllerData.xrController.pointer.rotationQuaternion!.toEulerAngles().x;
+                        const compensation = (1 + ((Math.PI / 2) - Math.abs(xRotation)));
                         // check parabolic ray
-                        const radius = this.parabolicCheckRadius;
+                        const radius = this.parabolicCheckRadius * compensation;
                         this._tmpRay.origin.addToRef(this._tmpRay.direction.scale(radius * 2), this._tmpVector);
                         this._tmpVector.y = this._tmpRay.origin.y;
                         this._tmpRay.origin.addInPlace(this._tmpRay.direction.scale(radius));
@@ -292,7 +298,7 @@ export class WebXRMotionControllerTeleportation extends WebXRAbstractFeature {
                             hitPossible = true;
                             this.setTargetMeshPosition(pick.pickedPoint);
                             this.setTargetMeshVisibility(true);
-                            this.showParabolicPath(pick);
+                            this._showParabolicPath(pick);
                         }
                     }
                 }
@@ -444,7 +450,7 @@ export class WebXRMotionControllerTeleportation extends WebXRAbstractFeature {
         this._currentTeleportationControllerId = "";
         // do the movement forward here
         if (this._options.teleportationTargetMesh && this._options.teleportationTargetMesh.isVisible) {
-            const height = this._options.xrInput.xrCamera.position.y - this._options.teleportationTargetMesh.position.y;
+            const height = this._options.xrInput.xrCamera.realWorldHeight;
             this._options.xrInput.xrCamera.position.copyFrom(this._options.teleportationTargetMesh.position);
             this._options.xrInput.xrCamera.position.y += height;
             this._options.xrInput.xrCamera.rotationQuaternion.multiplyInPlace(Quaternion.FromEulerAngles(0, controllerData.teleportationState.currentRotation, 0));
@@ -578,7 +584,7 @@ export class WebXRMotionControllerTeleportation extends WebXRAbstractFeature {
 
     private _quadraticBezierCurve: AbstractMesh;
 
-    private showParabolicPath(pickInfo: PickingInfo) {
+    private _showParabolicPath(pickInfo: PickingInfo) {
         if (!pickInfo.pickedPoint) { return; }
 
         const controllerData = this._controllers[this._currentTeleportationControllerId];