Browse Source

reusing functionalities, fixing parenting

Raanan Weber 5 năm trước cách đây
mục cha
commit
d3a0b425bd
1 tập tin đã thay đổi với 22 bổ sung31 xóa
  1. 22 31
      src/Cameras/XR/webXRControllerModelLoader.ts

+ 22 - 31
src/Cameras/XR/webXRControllerModelLoader.ts

@@ -1,4 +1,4 @@
-import { Quaternion } from '../../Maths/math.vector';
+import { Quaternion, Vector3 } from '../../Maths/math.vector';
 import { WindowsMotionController } from '../../Gamepads/Controllers/windowsMotionController';
 import { OculusTouchController } from '../../Gamepads/Controllers/oculusTouchController';
 import { WebXRInput } from './webXRInput';
@@ -21,56 +21,47 @@ export class WebXRControllerModelLoader {
 
             let controllerModel: WebVRController;
 
+            let rotation: Quaternion;
+            const position = new Vector3();
+
             switch (c.inputSource.gamepad.id) {
                 case "htc-vive": {
                     controllerModel = new ViveController(c.inputSource.gamepad);
-                    controllerModel.hand = c.inputSource.handedness;
-                    controllerModel.isXR = true;
-                    controllerModel.initControllerMesh(c.getScene(), (m) => {
-                        m.isPickable = false;
-                        m.getChildMeshes(false).forEach((m) => {
-                            m.isPickable = false;
-                        });
-                        controllerModel.mesh!.parent = c.grip!;
-                        controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(0, Math.PI, 0);
-                    });
+                    rotation = Quaternion.FromEulerAngles(0, Math.PI, 0);
                     break;
                 }
                 case "oculus-touch": {
                     controllerModel = new OculusTouchController(c.inputSource.gamepad);
-                    controllerModel.hand = c.inputSource.handedness;
-                    controllerModel.isXR = true;
-                    controllerModel.initControllerMesh(c.getScene(), (m) => {
-                        controllerModel.mesh!.parent = c.grip!;
-                        controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(0, Math.PI, 0);
-                        controllerModel.mesh!.position.y = 0.034;
-                        controllerModel.mesh!.position.z = 0.052;
-                    });
+                    rotation = Quaternion.FromEulerAngles(0, Math.PI, 0);
+                    position.y = 0.034;
+                    position.z = 0.052;
                     break;
                 }
                 case "oculus-quest": {
                     OculusTouchController._IsQuest = true;
                     controllerModel = new OculusTouchController(c.inputSource.gamepad);
-                    controllerModel.hand = c.inputSource.handedness;
-                    controllerModel.isXR = true;
-                    controllerModel.initControllerMesh(c.getScene(), (m) => {
-                        controllerModel.mesh!.parent = c.grip!;
-                        controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(Math.PI / -4, Math.PI, 0);
-                    });
+                    rotation = Quaternion.FromEulerAngles(Math.PI / -4, Math.PI, 0);
                     break;
                 }
                 default: {
                     controllerModel = new WindowsMotionController(c.inputSource.gamepad);
-                    controllerModel.hand = c.inputSource.handedness;
-                    controllerModel.isXR = true;
-                    controllerModel.initControllerMesh(c.getScene(), (m) => {
-                        controllerModel.mesh!.parent = c.grip!;
-                        controllerModel.mesh!.rotationQuaternion = Quaternion.FromEulerAngles(0, Math.PI, 0);
-                    });
+                    rotation = Quaternion.FromEulerAngles(0, Math.PI, 0);
                     break;
                 }
             }
 
+            controllerModel.hand = c.inputSource.handedness;
+            controllerModel.isXR = true;
+            controllerModel.initControllerMesh(c.getScene(), (m) => {
+                controllerModel.mesh!.parent = c.grip || input.baseExperience.container;
+                controllerModel.mesh!.rotationQuaternion = rotation;
+                controllerModel.mesh!.position = position;
+                m.isPickable = false;
+                m.getChildMeshes(false).forEach((m) => {
+                    m.isPickable = false;
+                });
+            });
+
             c.gamepadController = controllerModel;
         });
     }