Как установить положение камеры в Navisworks из Forge Viewer-а
Мы уже обсудили установку положения камеры в Revit, давайте попробуем сделать подобное для Navisworks.
Для достижения нужного результата в Navisworks, нам также необходимо получать данные камеры Forge Viewer. Но подход в данном случае будет несколько проще. В этом случае нам нужны только параметры положения, направлений и смещения (globalOffset).
Положение, направление и направление вверх камеры Forge Viewer так же получаем с помощью метода Viewer3D.getState({viewport: true}):
- {
- "viewport": {
- "name": "",
- "eye": [
- -14.870469093323,
- 36.571562767029,
- -1.2129259109497
- ],
- "target": [
- -14.770469665527,
- 36.571967124939,
- -1.2129259109497
- ],
- "up": [
- 0,
- 0,
- 1
- ],
- "worldUpVector": [
- 0,
- 0,
- 1
- ],
- "pivotPoint": [
- -14.770469665527,
- 36.571967124939,
- -1.2129259109497
- ],
- "distanceToOrbit": 0.10000024532334,
- "aspectRatio": 3.1789297658863,
- "projection": "perspective",
- "isOrthographic": false,
- "fieldOfView": 90.68087674208
- }
- }
Получаем смещение globalOffset из свойства viewer.model.getData().globalOffset, пример результата:
- {
- "x": -0.253891,
- "y": -45.556179,
- "z": 6.134186
- }
На этот раз нам не нужно вычитать вектор globalOffset из направления и позиции камеры Viewer-а, но Вы можете использовать аналогичный подход как для плагина Revit, но тогда Вам придется немного поменять код на стороне Navisworks
На стороне Navisworks:
- Document doc = Autodesk.Navisworks.Api.Application.ActiveDocument;
- Viewpoint vp = doc.CurrentViewpoint.CreateCopy();
- Point3D offset = new Point3D( -0.253891, -45.556179, 6.134186 );
- offset = offset.ToVector3D().Negate().ToPoint3D();
- Point3D pos = new Point3D( -15.12436009332275, -8.984616232971192, 4.921260089050291 );
- pos = pos.Subtract(offset).ToPoint3D();
- Point3D target = new Point3D( -15.02436066552734, -8.984211875061035, 4.921260089050291 );
- target = target.Subtract( offset ).ToPoint3D();
- Point3D up = new Point3D( 0, 0, 1 );
- // Устанавливаем параметры камеры
- vp.Position = pos;
- vp.PointAt( target );
- vp.AlignUp( up.ToVector3D() );
- doc.CurrentViewpoint.CopyFrom( vp );
Если вы на стороне Viewer-а использовали подход как для плагина Revit, то на стороне Navisworks offset будет (0, 0, 0)
- Point3D offset = new Point3D( 0, 0, 0 );
- offset = offset.ToVector3D().Negate().ToPoint3D();
- // ...
- pos = pos.Subtract(offset).ToPoint3D();
- // ...
- target = target.Subtract( offset ).ToPoint3D();
- // ...
Пример проекта плагина Navisworks доступен на GitHub.
Видео демонстрации результатов работы: https://youtu.be/aul5nfLjsUg
Источник: https://forge.autodesk.com/blog/map-forge-viewer-camera-back-navisworks
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 27.06.2019