Autodesk forge 如何从BIM BCF主题视点正确初始化Autodesk Forge 3D viewer?

Autodesk forge 如何从BIM BCF主题视点正确初始化Autodesk Forge 3D viewer?,autodesk-forge,autodesk-viewer,bim,Autodesk Forge,Autodesk Viewer,Bim,我正在尝试根据BCF文件中的BIM主题可视化数据正确初始化Autodesk Forge 3D viewer 我已将三维模型(IFC)上载到Autodesk API,并已对其进行处理,我可以使用Autodesk Forge 3D viewer成功地可视化/导航模型 我在Nemetschek SOLIBRI中使用了相同的三维模型(IFC)来创建主题,并使用BIM BCF 2.1标准将其导出(请参阅) VisualizationInfo中的XML数据: <PerspectiveCamera>

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

我已将三维模型(IFC)上载到Autodesk API,并已对其进行处理,我可以使用Autodesk Forge 3D viewer成功地可视化/导航模型

我在Nemetschek SOLIBRI中使用了相同的三维模型(IFC)来创建主题,并使用BIM BCF 2.1标准将其导出(请参阅)

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>
结果: Forge 3D viewer相机视图与SOLIBRI中的视图不匹配,也与BCF文件中保存为快照png的视图不匹配


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

值不是Forge viewer的目标参数。你必须用下面的公式自己计算

{Target}={CameraViewPoint}+{camerradirection}*{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 ); 

享受吧

谢谢,解决了。我建议您更新您的文档,没有提到
impl
setViewFromCamera
。我未能使用
setViewFromArray
获得相同的结果:文档确实过时了。但是,
impl
是一个私有对象,
setViewFromCamera
是Forge Viewer的私有API。因此,该文件中不会列出。
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 );