Можно ли выдавливать грани вдоль нормалей индивидуально в OpenSCAD?

Для геометрии, которую я делаю, я хочу выдавливать каждую грань индивидуально вдоль ее нормали.

Это стандартная процедура в программах 3D-моделирования, таких как Blender; см. Пример 3 здесь.

Возможно ли это в OpenSCAD?

, 👍3


3 ответа


2

Вытягивание граней возможно только на 2D полигонах. Из 3D-объекта вы не можете захватить лицо и вытянуть его. Чтобы вытянуть "грани", вам нужно будет определить форму грани и расширить ее в третьем измерении по вашему выбору. Таким образом, создается 3D-фигура, которую можно связать (соединить, например, с помощью соединения) с исходной фигурой. Для вытягивания доступна функция linear_extrude:

linear_extrude(высота = ширина веера, центр = true, выпуклость = 10, поворот = -fanrot, срезы = 20, масштаб = 1,0, $fn = 16) {...}

,

Пока вы можете знать, в какой плоскости находится грань, вы можете "спроецировать" ее в 2D-форму, а затем выдавливать ее. Вы также можете запечатлеть тонкий срез вокруг грани вручную с помощью "пересечения", а затем "окружить" его изображением самого себя. (В зависимости от объекта последнее может давать или не давать точные результаты.), @R.. GitHub STOP HELPING ICE

@R.. Очень хорошие примеры для выдавливания "лиц"! Пожалуйста, добавьте это в качестве отдельного ответа или включите в свой текущий ответ., @0scar

Я добавил это как отдельный ответ, так как он не связан с моим существующим., @R.. GitHub STOP HELPING ICE

@R.. Очень приятно, и, конечно, хорошо, что вы разделили ответы!, @0scar


1

Встроенное в язык и его модель CSG, отсутствие обработки дерева CSG-это совершенно отдельный этап после выполнения функционального языка, и нет способа "прочитать" что - либо из преобразования модели в грани, чтобы работать с гранями.

Тем не менее, вы можете сделать это, если хотите сами немного потрудиться или поискать библиотечный код у кого-то, кто уже это сделал. Что это будет означать, так это разработка собственной формы описания с точки зрения вложенных списков, представляющих модель, с модулем для преобразования списка в дерево CSG OpenSCAD. Затем вы можете написать функции для произвольного управления этим описанием, по сути, заново создав CSG-фазу OpenSCAD в своем собственном языке. Некоторые меньшие версии этого определенно делались в прошлом для таких вещей, как реализация функций типа "лофт" в OpenSCAD.

,

2

Для вытягивания одной грани, пока вы можете знать плоскость, в которой находится грань, вы можете спроецировать ее в 2D-форму, а затем linear_extrude это. В общем случае вам нужен вариант проекции cut=true, и вам нужно перевести/повернуть проецируемый объект так, чтобы грань находилась в плоскости XY (это часть "до тех пор, пока вы можете это знать"). К сожалению, это подвержено числовой нестабильности, поэтому вам, вероятно, придется перевести его на дополнительные 0,001 или около того, чтобы пересечь плоскость XY, и в этом случае вы получите приближение грани, а не ее точную версию.

(Строго говоря, в OpenSCAD все равно нет точных данных, за исключением случаев, когда лица разделяют точки в многограннике, поэтому это ограничение, вероятно, не ухудшает ситуацию, чем она уже является в OpenSCAD).

Как только у вас появится проекция, вы можете выровнять ее в любом нужном вам направлении, манипулировать результатом (например, перекосить с помощью матрицы преобразования), повернуть и перевести ее обратно на грань. Должно быть возможно объединить всю эту операцию в модуль, который работает со своим дочерним[ren].

Другой подход состоял бы в захвате тонкого среза вокруг грани вручную через пересечение, а затем выполнении корпуса с переводом самого себя, но это будет работать только в том случае, если он выпуклый (в противном случае корпус также заполнит выпуклую оболочку формы 2D-лица).

,