Scenegraph/ru

FreeCAD в основном колаж из разлинчных мощных библиотек, наиболее важной из кототрых является openCascade, для управления и построения геометрии, Coin3d отображает эту геометрию, и Qt помещает все это в хороший Графический Интерфейс Пользователя.

Геометрия которая появляется в 3D видах FreeCAD получается с помощью библиотек Coin3D. Coin3D это реализация стандарта OpenInventor. OpenCascade тоже поддерживает схожую функциональность, но было решено при создании FreeCAD, не использовать встроеный в openCascade просмотрщик и скорее перейти на более производительный coin3D.

OpenInventor на самом деле язык описания 3D сцены. Сцена описанная в openInventor затем отрисовывается OpenGL на вашем  экране. Coin3D заботит об этом, поэтому программисту не надо иметь дело со сложными вызовами openGL, он просто должен предоставить корректный(работающий)OpenInventor код. Большим преимуществом является то что openInventor это широко известны и хорошо задокументированный стандарт.

Одну из главных работ, которую FreeCAD делает за вас, в основном это перевод информации о openCascade геометрии в формат языка openInventor.

OpenInventor записывает трехмерную сцену в форме древа сцен, как показано ниже:

рисунок с сайта Inventor mentor

Дерево сцен openInventor описывает все части 3D сцены, такие как геометрия, цвета, материалы, освещение, и.т.д. и организует все эти данные в удобной и четкой структуре. Все что угодно может быть сгруппировано в субструктуры, позволяя вам организовывать содержание вашей сцены тем способом который вам нравится. Вот пример файла в формате openInventor :

#Inventor V2.0 ascii Separator { RotationXYZ { axis Z        angle 0 }     Transform { translation 0 0 0.5 }     Separator { Material { diffuseColor 0.05 0.05 0.05 }        Transform { rotation 1 0 0 1.5708 scaleFactor 0.2 0.5 0.2 }        Cylinder { }     }  }

Как вы можете видеть, его структура проста. Вы используете разделители(separator) организуя ваши данные в блоки, это немного похоже на то как вы организуете ваши файлы в папках. Каждый оператор влияет на то что будет дальше, например, первые два пункта в ваншем корневом разделителе это поворот и перенос(трансляция), как они повлияют на следующий элемент, котоорый тоже является резделителем. В этом сепараторе, материал определяется, и другого преобразования. Поэтому наш цилиндр будет подвержин обеим трансормациям, то что было применено непосредственно к нем, так и то что было применено к родительскому разделителю.

Мы также обладаем множество элементов других типов, для организации нашей сцены, таких как группы, переключатели и анотации.Мы можем задать очень сложные материалы для ваших объектов, с цветом, текстурой, теневыми режимами и прозрачностью. Мы также можем задать освещение, камеры, и даже движение. Можно даже встроить кусочки сценариев в openInventor файлы, для задания более сложного поведения.

Если вы заинтересованы в получении дополнительной информации о openInventor, отпраляйтесь напрямую к самому известному руководству Inventor mentor.

В FreeCAD, как правило. не нужно напрямуюю взаимодействовать с древом сцен openInventor. Каждый объект в документе FreeCAD, будь то полигиональная модель(mesh), форма детали или что-нибудь ещё, автоматически преобразуется в openInventor код и вставляется в основное дерево сцен которое вы видите в окне 3D просмотра. Это древо сцен непрерывно обновляется, когда вы делает изменения, добавляете или удаляете объекты из документа. В самом деле каждый объект (в пространстве App) обладает, поставщиком визуального отображения (соответствующий объект в пространстве Gui), ответственного за выдачу openInventor кода.

Но есть множество преимуществ, которые будут возможны при прямом доступе. Например, мы временно можем изменить внешний вид объекты, или мы можем добавить в сцену объекты, которые не обладают реальным представлением в документе FreeCAD, такие как геометрия построений, помощники, графические подсказки или инструменты, такие как манипуляторы или отображающаяся на экране информация.

FreeCAD обладает несколькими инструментами для просмотра и изменения openInventor кода. На пример, нижеследующий код на python отобразит openInventor представление выбранного объекта:

obj = FreeCAD.ActiveDocument.ActiveObject viewprovider = obj.ViewObject print viewprovider.toString

А также мы обладаем модулем python открывает полный доступ к управлению чем угодно в Coin3D, такому как ваше дерево сцен в FreeCAD. Также читайте об этом на странице Pivy.