【问题标题】:How to initialize Autodesk Forge 3D viewer correctly from BIM BCF Topic Viewpoint?如何从 BIM BCF 主题视点正确初始化 Autodesk Forge 3D 查看器?
【发布时间】:2019-07-19 01:28:50
【问题描述】:

我正在尝试根据 BCF 文件中的 BIM 主题可视化数据正确初始化 Autodesk Forge 3D 查看器。

我已将 3D 模型 (IFC) 上传到 Autodesk API,它已经过处理,我可以使用 Autodesk Forge 3D 查看器成功地可视化/导航模型。

我在 Nemetschek SOLIBRI 中使用相同的 3D 模型 (IFC) 创建主题并使用 BIM BCF 2.1 标准将其导出(请参阅https://github.com/buildingSMART/BCF-XML)。

来自 VisualizationInfo 的 XML 数据:

<PerspectiveCamera>
  <CameraViewPoint>
      <X>2.803843040759871</X>
      <Y>14.568845808384443</Y>
      <Z>0.8249055320631105</Z>
  </CameraViewPoint>
  <CameraDirection>
      <X>0.4898262677194313</X>
      <Y>-0.8652456579090667</Y>
      <Z>0.1068652371988122</Z>
  </CameraDirection>
  <CameraUpVector>
      <X>-0.05264688190667085</X>
      <Y>0.09299722978166312</Y>
      <Z>0.9942735142195238</Z>
  </CameraUpVector>
  <FieldOfView>60.0</FieldOfView>
</PerspectiveCamera>

我尝试在 Autodesk Forge 3D 查看器上设置相同的相机/视图:

viewer.restoreState(JSON.parse(`{
  "viewport": {
    "eye": [2.803843040759871, 14.568845808384443, 0.8249055320631105],
    "target": [0.4898262677194313, -0.8652456579090667, 0.1068652371988122],
    "up": [-0.05264688190667085, 0.09299722978166312, 0.9942735142195238],
    "projection": "perspective",
    "isOrthographic": false,
    "fieldOfView": 60.0
  }
}`));

结果: 一个 Forge 3D 查看器相机视图,与 SOLIBRI 中看到的不匹配,也不匹配在 BCF 文件中保存为 snapshot-png 的视图。

也许 SOLIBRI 中的 IFC 模型和 Autodesk 处理的 IFC 模型具有不同的坐标系,或者可能是什么错误?

【问题讨论】:

    标签: autodesk-forge autodesk-viewer bim


    【解决方案1】:

    CameraDirection 值不是 Forge 查看器的目标参数。您必须使用以下公式自行计算。

    {Target} = {CameraViewPoint} + {CameraDirection} * {CurrentFocalLength}

    您的问题视图的完整相机映射将是:

    var lengthScale = 1000; //! Use viwer.model.getUnitString(), the model I loaded is in `mm`, and BCF camera definition is in `m`
    var eye = new THREE.Vector3( 2.803843040759871 * lengthScale, 14.568845808384443 * lengthScale, 0.8249055320631105 * lengthScale );
    var sightVec = new THREE.Vector3( 0.4898262677194313, -0.8652456579090667,  0.1068652371988122 ).multiplyScalar( viewer.navigation.getFocalLength() );
    var target = eye.clone().add( sightVec )
    var up = new THREE.Vector3( -0.05264688190667085, 0.09299722978166312, 0.9942735142195238 );
    
    //Since Forge Viewer will apply a global offset to the whole model
    var offsetMatrix = viewer.model.getData().placementWithOffset;
    var offsetEye = eye.applyMatrix4(offsetMatrix); 
    var offsetTarget = target.applyMatrix4(offsetMatrix);
    var fov = 60;
    
    var cameraView = {
        aspect: viewer.getCamera().aspect,
        isPerspective: true,
        fov: fov,
        position: offsetEye,
        target: offsetTarget,
        up: up,
        orthoScale: 1
    };
    
    viwer.impl.setViewFromCamera( cameraView ); 
    

    尽情享受吧!

    【讨论】:

    • 谢谢,解决了。我建议你更新你的文档,没有提到implsetViewFromCamera。我未能与setViewFromArray 获得相同的结果:forge.autodesk.com/en/docs/viewer/v6/reference/javascript/…
    • 确实文档已经过时了。但是,impl 是私有对象,setViewFromCamera 是 Forge Viewer 的私有 API。因此,它不会在文档中列出。
    猜你喜欢
    • 2021-02-17
    • 2023-04-07
    • 2019-05-04
    • 2021-12-09
    • 2021-11-12
    • 1970-01-01
    • 2017-02-21
    • 2017-01-09
    • 2018-05-21
    相关资源
    最近更新 更多