需要Forge Viewer和陀螺仪的帮助需要将摄像机的初始位置固定为Bim模型中的当前视图

问题描述

我们正在努力将摄像机在查看器中定位到陀螺仪的位置。这部分我们开始工作。对于我们的一位客户,在激活陀螺仪时,我们需要观察者的初始起始位置,使其与我们所看的方向相同。因此,当激活陀螺仪时,观看者会停留在相同的方向(从左到右的角度),但是当我将数位板向右旋转时,观看者也会向右旋转。 这里的挑战在于在激活陀螺仪之前将观察者的摄像机位置转换为alpha偏移。 在下面的示例中,您具有函数calibrateCompassOffset(),该函数尝试根据当前摄像机位置计算alphaOffset。但是它现在可以按预期工作(当我查看模型的正面时,会将其校准到错误的位置)。我希望在打开陀螺仪后也能看到正面。

**Below was the code snippet :**
     /**
      * Make sure the given angle falls in between 0 and 360
      *   {number} aAngle
      *  s {number}
     */
   private scaleAngle = (aAngle: number): number => {
    for (let i = aAngle; i < 0; i += 360) { aAngle += 360; }
    for (let i = aAngle; i > 360; i -= 360) { aAngle -= 360; }
    return aAngle;
   }

   //Updating  the viewer camera positions using device orientation positions

      if(this.deviceOrientation.gamma > 0.0){
        this.deviceOrientation.alpha = this.deviceOrientation.alpha-180.0;
      }
let newCameraDirectionAlpha = this._initialCameraDirection.clone().
      applyAxisAngle(this._initialCameraUp,Math.PI * this.deviceOrientation.alpha / 180.0);
      let newCameraDirectionBeta = this._initialCameraDirection.clone().
      applyAxisAngle(this._initialCameraUp,Math.PI*this.deviceOrientation.beta/180.0);
      let newCameraDirectionGamma = this._initialCameraDirection.clone().
      applyAxisAngle(this._initialCameraUp,Math.PI*this.deviceOrientation.gamma/180.0);
      this.viewer.navigation.setTarget(newCameraDirectionAlpha.add(this._initialCameraPosition));
      this.viewer.navigation.setTarget(newCameraDirectionBeta.add(this._initialCameraPosition));
      this.viewer.navigation.setTarget(newCameraDirectionGamma.add(this._initialCameraPosition));

解决方法

我花了更多时间玩数学(源代码,陀螺仪查看器扩展),但不幸的是,运气不好……这是实验的最终状态:

在扩展的结尾,您可以看到我在将角度应用于相机方向时尝试的几种方法(_updateCameraDirectionV1_updateCameraDirectionV2,...),最后一个如下所示:

    _updateCameraDirectionV3(initialCameraDir,alpha,beta,gamma) {
        let euler = new THREE.Euler();
        euler.set(beta,-gamma,'YXZ');
        let q = new THREE.Quaternion();
        q.setFromEuler(euler);
        return initialCameraDir.clone().applyQuaternion(q);
    }

此逻辑(受three.js'DeviceOrientationControls启发)与您要使用的逻辑有些接近,但仍然不存在。我怀疑问题出在实际角度和顺序上。

我发现令我有些困惑的另一件事是,在https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Orientation_and_motion_data_explained上,它表示 alpha 值应表示围绕Z轴的旋转(“显示给观看者”),但在我的本地测试中, alpha 实际上是围绕Y轴(指向“从设备中心到设备顶部”的轴)旋转的。