ADN Open CIS
Сообщество программистов Autodesk в СНГ

27/06/2019

Как установить положение камеры в Navisworks из Forge Viewer-а

Мы уже обсудили установку положения камеры в Revit, давайте попробуем сделать подобное для Navisworks.

Для достижения нужного результата в Navisworks, нам также необходимо получать данные камеры Forge Viewer. Но подход в данном случае будет несколько проще. В этом случае нам нужны только параметры положения, направлений и смещения (globalOffset).

Положение, направление и направление вверх камеры Forge Viewer так же получаем с помощью метода Viewer3D.getState({viewport: true}):

Код - JavaScript: [Выделить]
  1. {
  2.   "viewport": {
  3.     "name": "",
  4.     "eye": [
  5.       -14.870469093323,
  6.       36.571562767029,
  7.       -1.2129259109497
  8.     ],
  9.     "target": [
  10.       -14.770469665527,
  11.       36.571967124939,
  12.       -1.2129259109497
  13.     ],
  14.     "up": [
  15.       0,
  16.       0,
  17.       1
  18.     ],
  19.     "worldUpVector": [
  20.       0,
  21.       0,
  22.       1
  23.     ],
  24.     "pivotPoint": [
  25.       -14.770469665527,
  26.       36.571967124939,
  27.       -1.2129259109497
  28.     ],
  29.     "distanceToOrbit": 0.10000024532334,
  30.     "aspectRatio": 3.1789297658863,
  31.     "projection": "perspective",
  32.     "isOrthographic": false,
  33.     "fieldOfView": 90.68087674208
  34.   }
  35. }

Получаем смещение globalOffset из свойства viewer.model.getData().globalOffset, пример результата:

Код - JavaScript: [Выделить]
  1. {
  2.   "x": -0.253891,
  3.   "y": -45.556179,
  4.   "z": 6.134186
  5. }

На этот раз нам не нужно вычитать вектор globalOffset из направления и позиции камеры Viewer-а, но Вы можете использовать аналогичный подход как для плагина Revit, но тогда Вам придется немного поменять код на стороне Navisworks

На стороне Navisworks:

Код - C#: [Выделить]
  1. Document doc = Autodesk.Navisworks.Api.Application.ActiveDocument;
  2. Viewpoint vp = doc.CurrentViewpoint.CreateCopy();
  3.  
  4. Point3D offset = new Point3D( -0.253891, -45.556179, 6.134186 );
  5. offset = offset.ToVector3D().Negate().ToPoint3D();
  6.  
  7. Point3D pos = new Point3D( -15.12436009332275, -8.984616232971192, 4.921260089050291 );
  8. pos = pos.Subtract(offset).ToPoint3D();
  9.  
  10. Point3D target = new Point3D( -15.02436066552734, -8.984211875061035, 4.921260089050291 );
  11. target = target.Subtract( offset ).ToPoint3D();
  12.  
  13. Point3D up = new Point3D( 0, 0, 1 );
  14.  
  15. // Устанавливаем параметры камеры
  16. vp.Position = pos;
  17. vp.PointAt( target );
  18. vp.AlignUp( up.ToVector3D() );
  19. doc.CurrentViewpoint.CopyFrom( vp );

Если вы на стороне Viewer-а использовали подход как для плагина Revit, то на стороне Navisworks offset будет (0, 0, 0)

Код - C#: [Выделить]
  1. Point3D offset = new Point3D( 0, 0, 0 );
  2. offset = offset.ToVector3D().Negate().ToPoint3D();
  3.  
  4. // ...
  5. pos = pos.Subtract(offset).ToPoint3D();
  6.  
  7. // ...
  8. target = target.Subtract( offset ).ToPoint3D();
  9.  
  10. // ...

Пример проекта плагина 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