Легкая сборка (threejs)

1+

Последние два месяца не было времени заниматься разработкой редактора, так как был приглашен в качестве разработчика компанией «Пермская деревянная игрушка» https://dolodom.com/, которая занимается изготовлением различных изделий из фанеры. Для сборки и визуализации макетов они развивают собственный редактор, созданный на базе стандартного редактора three.js. Сборка макета происходила примерно так, как на этом видео https://www.youtube.com/watch?v=yTAZi-5-EfA. Есть привязка по вершинам сетки, что удобно.

Я предложил несколько усовершенствовать процесс сборки и сделать его более простым для пользователя. Вначале я хотел сделать просто выравнивание плоскости шипа по плоскости паза (и реализовал это). Но мы решили, что это тоже не так удобно и решили попробовать сделать инструмент, наиболее приближенный к реальности. А в реальности у нас шип вставляется в паз. То есть нужно определить, что является пазом, а что шипом. С учетом того, что геометрия формируется в Blender на стороне сервера из кривых, импортированных из векторных редакторов, в качестве исходных данных мы имеем мэш с двумя типами материала – лицевая сторона и торец. То есть никакой информации о том, что является шипом или пазом нет, только набор точек и треугольников. Для реализации инструмента мной был написан алгоритм анализа мэша.

Во-первых, нужно было упростить модели для расчетов. Для этого все грани торца (лицевая часть отбрасывается, так как не участвует в расчетах) разделяются на две части – внутренние и внешние. Все грани, имеющие сонаправленные нормали, объединяются в одну. Все внутренние грани объединяются в  отдельные группы, образующие замкнутые контур (отверстие). Так как отверстие может быть любой формы, на основе полученных групп строится обрамляющие параллелепипеды. Ориентация параллелепипеда определяется исходя из направления главных осей симметрии. Главные оси симметрии находятся по формулам сопромата для вершин контура, принимая их за отдельные материальные точки, то есть при равномерном распределении точек работает корректно, чего достаточно для случая с пазами – они симметричны.

Определение паза происходит путем нахождения перпендикулярных плоскостей  к выбранной грани, если обращены в сторону нормали выбранной грани.

При выборе шипа или паза на второй детали при зажатой клавише shift вторая деталь клонируется.

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

Как теперь происходит сборка можно посмотреть на видео.

1+