Можно ли выдавливать грани вдоль нормалей индивидуально в OpenSCAD?
Для геометрии, которую я делаю, я хочу выдавливать каждую грань индивидуально вдоль ее нормали.
Это стандартная процедура в программах 3D-моделирования, таких как Blender; см. Пример 3 здесь.
Возможно ли это в OpenSCAD?
@Romwell, 👍3
3 ответа
Вытягивание граней возможно только на 2D полигонах. Из 3D-объекта вы не можете захватить лицо и вытянуть его. Чтобы вытянуть "грани", вам нужно будет определить форму грани и расширить ее в третьем измерении по вашему выбору. Таким образом, создается 3D-фигура, которую можно связать (соединить, например, с помощью соединения
) с исходной фигурой. Для вытягивания доступна функция linear_extrude
:
linear_extrude(высота = ширина веера, центр = true, выпуклость = 10, поворот = -fanrot, срезы = 20, масштаб = 1,0, $fn = 16) {...}
Встроенное в язык и его модель CSG, отсутствие обработки дерева CSG-это совершенно отдельный этап после выполнения функционального языка, и нет способа "прочитать" что - либо из преобразования модели в грани, чтобы работать с гранями.
Тем не менее, вы можете сделать это, если хотите сами немного потрудиться или поискать библиотечный код у кого-то, кто уже это сделал. Что это будет означать, так это разработка собственной формы описания с точки зрения вложенных списков, представляющих модель, с модулем для преобразования списка в дерево CSG OpenSCAD. Затем вы можете написать функции для произвольного управления этим описанием, по сути, заново создав CSG-фазу OpenSCAD в своем собственном языке. Некоторые меньшие версии этого определенно делались в прошлом для таких вещей, как реализация функций типа "лофт" в OpenSCAD.
Для вытягивания одной грани, пока вы можете знать плоскость, в которой находится грань, вы можете спроецировать
ее в 2D-форму, а затем linear_extrude
это. В общем случае вам нужен вариант проекции cut=true
, и вам нужно перевести/повернуть проецируемый объект так, чтобы грань находилась в плоскости XY (это часть "до тех пор, пока вы можете это знать"). К сожалению, это подвержено числовой нестабильности, поэтому вам, вероятно, придется перевести его на дополнительные 0,001 или около того, чтобы пересечь плоскость XY, и в этом случае вы получите приближение грани, а не ее точную версию.
(Строго говоря, в OpenSCAD все равно нет точных данных, за исключением случаев, когда лица разделяют точки в многограннике
, поэтому это ограничение, вероятно, не ухудшает ситуацию, чем она уже является в OpenSCAD).
Как только у вас появится проекция, вы можете выровнять
ее в любом нужном вам направлении, манипулировать результатом (например, перекосить с помощью матрицы преобразования), повернуть и перевести ее обратно на грань. Должно быть возможно объединить всю эту операцию в модуль
, который работает со своим дочерним[ren].
Другой подход состоял бы в захвате тонкого среза вокруг грани вручную через пересечение
, а затем выполнении корпуса
с переводом самого себя, но это будет работать только в том случае, если он выпуклый (в противном случае корпус
также заполнит выпуклую оболочку формы 2D-лица).
- Библиотека OpenSCAD для пустого пространства/отверстий
- Рендер OpenSCAD (F6) завершается ошибкой "ERROR: CGAL error in CGAL_Nef_polyhedron3()"
- Создание "куска пирога" в OpenSCAD?
- Как добавить отверстие 2х2 мм в файл SCAD?
- Разрезать ленту Мёбиуса на четыре части с замком
- Какие виды зазоров/допусков следует использовать при проектировании деталей, которые подходят друг к другу?
- Инструмент для измерения в STL-файлах
- Каков самый простой способ изменить/изменить размер объекта внутри STL-файла?
Пока вы можете знать, в какой плоскости находится грань, вы можете "спроецировать" ее в 2D-форму, а затем выдавливать ее. Вы также можете запечатлеть тонкий срез вокруг грани вручную с помощью "пересечения", а затем "окружить" его изображением самого себя. (В зависимости от объекта последнее может давать или не давать точные результаты.), @R.. GitHub STOP HELPING ICE
@R.. Очень хорошие примеры для выдавливания "лиц"! Пожалуйста, добавьте это в качестве отдельного ответа или включите в свой текущий ответ., @0scar
Я добавил это как отдельный ответ, так как он не связан с моим существующим., @R.. GitHub STOP HELPING ICE
@R.. Очень приятно, и, конечно, хорошо, что вы разделили ответы!, @0scar