diff --git a/README.md b/README.md index 233f5b5..b219c0b 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,14 @@ - __Предикат стабильной осуществимости__. Верен для последовательности сборки, когда сборка на каждом из этапов приходит к стабильному состоянию. - __Предикат степеней свободы__. Формируется на основе уже сгенерированных графов/графа сборки. В каких степенях свободы возможно перемещать деталь. +# Технология компьютерной графики (СG) + +Общие функции CG-модуля: + - передача 3д-моделей из CAD в CG, + - полигональное моделирование/преобразование меш объектов, + - перестроение материалов в PBR представление, + - запекание текстуры меш объектов, + - сборка CG ассетов из объектов и текстур, + - экспорт полигональных объектов с текстурами в универсальные форматы, + - утилиты общего пользования, + - прикладные инстументы редактирования 3д-моделей. diff --git a/cg/README.md b/cg/README.md new file mode 100644 index 0000000..dc7a7b9 --- /dev/null +++ b/cg/README.md @@ -0,0 +1,116 @@ +## CAD-модуль + +Модуль реализован на API FreeCAD. Директория разработки `freecad`. + + +## CG-модуль + +Модуль реализован на API Blender. Директория разработки `blender`. + + +Интерфейс между CAD-модулем и CG-модулем передает: + - Имя детали. Это лейбл детали, имя заданное и читаемое человеком в CAD среде. + - Тип детали. Тип может быть: твердотельным объектом, полигональным объектом, системой координат, элементом иерархии сброрки. + - BREP формула (для твердотельных объектов). + - Массив точек (для полигональных объектов). + - Локальные трансформации объекта. Перемещение, вращение, масштаб. + - Линейная иерархия объекта. Цепочка-список родитель-потомок. + - Материал объекта и его свойства. + +Интерфейс между CAD-модулем и CG-модулем может передавать данные: + - В виде массива точек; процедура тесселяции (BREP -> массив точек) выполняется на API CAD-модуля. + CAD-модуль имеет встроенные средства тесселяции. + - В виде BREP формулы; процедура тесселяции (BREP -> массив точек) выполняется на АPI CG-модуля. + CG-модуль использует OCCT/FreeCAD. + + +### Передача 3д-моделей из CAD в CG. + +Реализовано скриптами `cg/freecad/utils/freecad_to_json.py` `cg/blender/import_cad`. + +Задачи по передаче: + - Имени детали. Это лейбл детали, имя заданное и читаемое человеком в CAD среде. + - Типа детали. Тип может быть: твердотельным объектом, полигональным объектом, системой координат, элементом иерархии сброрки. + - BREP формулу (для твердотельных объектов). + - Массива точек (для полигональных объектов), по результату тесселяции BREP объектов по заданным параметрам. + - Локальные трансформации объекта. Перемещение, вращение, масштаб. + - Линейную иерархия объекта. Цепочка-список родитель-потомок. + - Данных материала объекта и его свойства в PBR представление. + +Проблемы и решения процедуры тесселяции (для всех API платформ): + - Вытянутые полигоны. + + ![](img/cad-cg_01.jpg "Вытянутые полигоны") + + - Проблемы: вытянутые полигоны могут вызвать как эстетические, так и технологические артефакты: + - артефакт затенения меша, артефакт при запекании текстуры, мерцание; + - заедание фрезы, путь которой прерываеться на каждой грани (фреза может перепрыгнуть или пропустить участок), вплоть до порчи заготовки и поломки фрезы. + + - Решение: увеличить уровень детализации при тесселяции и впоследствие оптимизировать меш до исходного уровня на этапе ретопологии. + + ![](img/cad-cg_remesh.jpg "Проблема, Увеличение детализации, Ретопология") + + - Полигоны с площадью, стремящейся к нулю. + + ![](img/cad-cg_02.jpg "Полигоны с площадью, стремящейся к нулю") + + - Проблемы: те же, что и у вытянутых полигонов + + - Решение: слить близлежащие точки воедино (большое значение радиуса слияния точек может нарушить геометрию, мы применяем безопасное значение 0.01 мм) + + - Тонкие (острые) элементы. + + ![](img/cad-cg_03.jpg "Тонкие/острые элементы") + + - Проблемы: вытянутые полигоны могут вызвать как эстетические, так и технологические артефакты: + - артефакты при слиянии точек (называемые non-manifold); + - артефакты при запекании текстур, если тонкий элемент меньше допуска запекания; + - низкая прочтость и поломка заготовки при производстве. + + - Решение: избегать тонких элементов при проектировании, делать элементы отдельными составными частями, возможно из другого, более прочного материала. + + - Вывернутые наизнанку полигоны. + + ![](img/cad-cg_04.jpg "Вывернутые наизнанку полигоны") + + - Проблемы: вывернутые наизнанку полигоны нарушают твердотельность детали + + - Решение: пересчитать нормали полигонов. + + - Разрывы поверхностей. + + Отсутствие отдельных полигонов, дырки. Так же визуально артефакт может быть незаметен у близко расположенных точек полигона. Полигон может быть отдельным куском поверхности. + + - Проблемы: те же, что и у полигонов с площадью, стремящейся к нулю. + + - Решение: то же, что и у полигонов с площадью, стремящейся к нулю. + + +### Полигональное моделирование/преобразование меш объектов. + +Реализовано скриптами `cg/blender/processing`, для решения задач: + - перестроение иерархии сцены по данным разметки FreeCAD сцены (LCS точек) `cg/blender/processing/restruct_hierarchy_by_lcs.py`, + - группировка жестко собранных деталей в группы `cg/blender/processing/highpoly_setup.py`, + - объединение групп в монолитные модели для экспорта в Gazebo `cg/blender/processing/midpoly_setup.py`, + - генерация оптимизированных моделей `cg/blender/processing/lowpoly_setup.py`, + - развертка оптимизированных моделей `cg/blender/processing/uv_setup.py`. + + +### Запекание текстуры меш объектов. + +Реализовано скриптами `cg/blender/texturing`, для решения задач: + - подготовка очереди процесса запекания текстур `cg/blender/texturing/bake_submitter.py`, + - обработка запеченных текстур `cg/blender/texturing/composing.py`, + - сборка CG ассетов из объектов и текстур `cg/blender/texturing/shading.py`. + + +### Экспорт полигональных объектов с текстурами в универсальные форматы. + +Реализовано скриптами `cg/blender/export`, для решения задач экспорта в форматы: fbx, dae, stl, ply (и др. поддерживаемых API Blender). + + +### Аддоны для прикладного использования. + +Реализовано скриптами `cg/blender/scripts` + - BakeWrangler - аддон запекания текстур, + - Robossembler - аддон для генерации JSON описания сцены. diff --git a/cg/img/cad-cg_01.jpg b/cg/img/cad-cg_01.jpg new file mode 100644 index 0000000..27afdbe Binary files /dev/null and b/cg/img/cad-cg_01.jpg differ diff --git a/cg/img/cad-cg_02.jpg b/cg/img/cad-cg_02.jpg new file mode 100644 index 0000000..3b3a76a Binary files /dev/null and b/cg/img/cad-cg_02.jpg differ diff --git a/cg/img/cad-cg_03.jpg b/cg/img/cad-cg_03.jpg new file mode 100644 index 0000000..04761c7 Binary files /dev/null and b/cg/img/cad-cg_03.jpg differ diff --git a/cg/img/cad-cg_04.jpg b/cg/img/cad-cg_04.jpg new file mode 100644 index 0000000..6155223 Binary files /dev/null and b/cg/img/cad-cg_04.jpg differ diff --git a/cg/img/cad-cg_remesh.jpg b/cg/img/cad-cg_remesh.jpg new file mode 100644 index 0000000..6b2d495 Binary files /dev/null and b/cg/img/cad-cg_remesh.jpg differ