Как правильно инициализировать средство просмотра Autodesk Forge 3D из BIM BCF Topic Viewpoint?
Я пытаюсь правильно инициализировать средство просмотра Autodesk Forge 3D на основе данных визуализации тем BIM из файла BCF.
Я загрузил 3D-модель (IFC) в Autodesk API, она была обработана, и я могу успешно визуализировать / перемещать модель с помощью средства просмотра Autodesk Forge 3D.
Я использовал ту же 3D-модель (IFC) в Nemetschek SOLIBRI для создания темы и экспортировал ее с использованием стандарта BIM BCF 2.1 (см. https://github.com/buildingSMART/BCF-XML).
XML-данные из VisualizationInfo:
<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 viewer, который НЕ совпадает ни с тем, что виден в SOLIBRI, ни с тем, который сохранен как snapshot-png в файле BCF.
Может быть, IFC-модель в SOLIBRI и Autodesk-processing-IFC-модель имеют разные системы координат или в чем может быть ошибка?
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 );
Наслаждайся этим!