需要 Forge Viewer 和 Gyroscope 的帮助。需要将初始相机位置固定到 Bim 模型中的当前视图

Posted

技术标签:

【中文标题】需要 Forge Viewer 和 Gyroscope 的帮助。需要将初始相机位置固定到 Bim 模型中的当前视图【英文标题】:Need help for Forge Viewer and Gyroscope. Need the initial camera position to be fixed to the current view In Bim Model 【发布时间】:2021-02-01 20:31:53 【问题描述】:

我们正在努力将查看器中的摄像头定位到陀螺仪的位置。这部分我们开始工作了。对于我们的一位客户,我们需要在激活陀螺仪时查看器的初始起始位置与我们正在查看的方向相同。因此,当激活陀螺仪时,观察者保持在同一方向(从左到右的角度),但是当我将平板电脑向右转动时,观察者也会转向右侧。 这里的挑战在于在激活陀螺仪之前将观察者的相机位置转换为 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));

【问题讨论】:

【参考方案1】:

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

测试应用:https://github.com/petrbroz/forge-basic-app/tree/experiment/gyroscope 陀螺仪查看器扩展:GyroscopeExtension.js

在扩展的末尾,您可以看到我在将角度应用于相机方向时尝试的几种方法(_updateCameraDirectionV1_updateCameraDirectionV2,...),最后一个看起来像这样:

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

这个逻辑(受三个.js 的DeviceOrientationControls 启发)有点接近您的目标,但仍然不存在。我怀疑问题出在实际角度及其顺序上。

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

【讨论】:

以上是关于需要 Forge Viewer 和 Gyroscope 的帮助。需要将初始相机位置固定到 Bim 模型中的当前视图的主要内容,如果未能解决你的问题,请参考以下文章

Autodesk Forge Viewer 中的令牌续订

如何在对象上调整大小 - Autodesk Forge Viewer

使用 forge-viewer/node_modules/@types/three 中的 THREE 会导致编译器错误

在 Forge Viewer 上查看原生 PDF 和 DWF,无需翻译

forge Viewer-无法旋转下面的标记?

Autodesk Forge 查看器 - 从“viewer.model.search”和“viewer.getSelection()”获取不同的值 dbId