Scenegraph/ru

Введение
Геометрия которая появляется в трёхмерных видах FreeCAD, получается с помощью библиотек Coin3d. Coin3D это реализация стандарта OpenInventor. OpenCASCADE тоже поддерживает схожую функциональность, но при создании FreeCAD было решено не использовать встроенный в OpenCASCADE просмотрщик, а скорее перейти на более производительный Coin3D. Для изучения этой библиотеки рекомендуется книга Open Inventor Mentor.

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

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

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



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

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

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

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

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

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

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

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

Coding examples
See Coin3d snippets courtesy of MariwanJ's research for the Design456 Workbench. The code repository of said examples can be found at https://github.com/MariwanJ/COIN3D_Examples.