Модификаторы являются важной частью языка программирования OpenSCAD, предназначенного для создания трехмерных моделей. Они позволяют изменять форму и свойства объектов, делая процесс моделирования более гибким и эффективным. Модификаторы в OpenSCAD позволяют проводить такие операции как перемещение, поворот, отражение, масштабирование, изменение цвета и прозрачности объекта объекта.
В этой статье мы рассмотрим различные модификаторы в OpenSCAD и приведем примеры их использования для создания разнообразных форм и конструкций. Всего в OpenSCAD 10 таких модификаторов:
- translate ()
- rotate ()
- scale()
- resize()
- mirror()
- multmatrix()
- color()
- offset()
- hull()
- minkowski()
Кроме того, существуют символы-модификаторы, часто используемые для быстрой отладки:
- * – отключить отображение объекта;
- ! – показать только данный объект;
- # – выделить цветом объект;
- % – сделать полупрозрачным.
- Модификаторы положения translate() и rotate()
- Модификатор перемещения translate()
- Модификатор поворота rotate()
- Модификатор зеркального отображения mirror()
- Модификатор цвета и прозрачности color ()
- Модификаторы изменения размера scale() и resize()
- Модификатор resize()
- Модификатор масштабирования scale()
- Модификаторы трансформаций
- Модификатор матрицы трансформаций multmatrix()
- Модификатор отступа offset()
- Модификатор общей оболочки hull()
- Модификатор minkowski()
- Вместо заключения: порядок имеет значение!
Модификаторы положения translate() и rotate()
Модификатор перемещения translate()
Translate() – это модификатор в OpenSCAD, который позволяет перемещать объекты в трехмерном пространстве. Он принимает три значения: x, y и z, которые определяют величину смещения по каждой из осей.
Пример использования данного модификатора может быть следующим:
1. Перемещение объекта на определенное расстояние вдоль оси X:
translate([10, 0, 0]) cube(20);

В этом примере мы переместили куб размером 20 единиц на 10 единиц в положительном направлении оси X.
2. Перемещение объекта на определенное расстояние вдоль всех трех осей:
translate([30, 30, 20]) sphere(10);

В данном случае мы переместили сферу радиусом 10 единиц на 30 единиц в положительном направлении оси X, на 30 единиц по оси Y и на 20 единиц в положительном направлении оси Z.
Модификатор translate может быть очень полезным при создании сложных трехмерных моделей, позволяя легко изменять их положение относительно других объектов в системе координат.
Модификатор поворота rotate()
Один из самых полезных модификаторов в OpenSCAD – это rotate([x,y,z]). Он позволяет вращать объекты в трехмерном пространстве, задавая углы поворота по осям x, y и z.
Пример использования:
// создаем куб размером 10x20x30
// и поворачиваем куб на 45 градусов по оси x
rotate([45, 0, 0]) cube([10, 20, 30]);
В этом примере мы сначала создаем прямоугольник размером 10x20x30. Затем мы используем модификатор rotate([45, 0, 0]), чтобы повернуть прямоугольник на 45 градусов по оси x. Результат будет выглядеть как наклоненный прямоугольник:

Модификатор rotate([x,y,z]) часто используется в комбинации с модификатором translate(), например:
// создаем куб размером 10x20x30
// поворачиваем куб на 45 градусов по оси x
// смещаем от по оси Z на 10 единиц вверх
translate([0, 0, 10]) rotate([45, 0, 0]) cube([10, 20, 30]);

В этом примере мы смещаем куб размером 10x20x30 по оси Z на 10 единиц вверх и поворачиваем его по оси X на 10 градусов.
Когда модификаторов много, можно использовать следующий вариант записи:
translate([0, 0, 10])
rotate([45, 0, 0])
cube([10, 20, 30]);
Это позволяет сразу найти среди множества модификаторов, нужный для коррекции. Отступом удобно выделять собственно объект.
Модификатор зеркального отображения mirror()
Функция mirror([x, y, z]) в языке программирования OpenSCAD является одним из модификаторов и используется для создания симметричного отражения объекта вокруг выбранной оси.
Пример использования данной функции может быть следующим:
// Выводим куб со стороной 10 единиц
cube([10, 10, 10]);
// Выводим отраженный по осям X и Y куб
mirror([1,1,0]) cube([10, 10, 10]);
Обратите внимание, что создаётся два объекта оригинального куба, и только ко второму применяется модификатор отзеркаливания.

В примере будет создан обычный куб со размером стороны 10 единиц. При помощи функции mirror () создается зеркальная копия куба по осям X и Y.
Обратите внимание, что создаётся два объекта оригинального куба, только ко второму применяется модификатор отзеркаливания. Новички часто создают только один куб, а потом отзеркаливают его же, и удивляются что куб отзеркалился, а оригинал исчез.
Модификатор цвета и прозрачности color ()
Color() является интересным модификатором – он изменяет цвет и прозрачность объекта, к которому применен.
Самый простой вариант использования данного модификатора выглядит так:
//Задает желтый цвет кубу прозрачность 50%
// color ( "цвет в двойных кавычках обязательно!", прозрачность от 0.0 до 1.0)
color ("yellow", 0.5)
cube([10, 10, 10]);
Цвет может задаваться тремя способами:
- через название цвета по таблице (см. подробнее в статье о цвете и прозрачности);
- через модель RGB-А, где цифры в скобках соответствую каналам Red, Green, Blue [0, 0, 1];
- через название цвета в HEX-модели;
В качестве примера, приведу следующий скрипт демонстрирующий все варианты задания цвета:
color ("yellow", 0.5) //цвет желтый прозрачность 50%
cube([10, 10, 10]);
translate([10, 10, 0])
color ([0, 0, 1], 1) // цвет синий (модель RGB) прозрачность 0%, непрозрачность 100%
cube([10, 10, 10]);
color ("red", 0.7) //цвет красный (HEX-модель) прозрачность 30%, непрозрачность 70%
translate([20, 20, 0])
cube([10, 10, 10]);

В данном примере используется модификатор цвета, который первому кубику придает прозрачность на 50%, и окрашивает его в желтый цвет. Ко второму кубику применяется модификатор translate([10,10, 0]) смещая его на 10 единиц по осям X и Y с окрашиванием в непрозрачный синий цвет. Ну а третий кубик смещается на 20 единиц по осям X и Y и через модификатор Color окрашивает его в красный и делает его непрозрачным на 70%, т.е. на 30% прозрачным.
Модификаторы изменения размера scale() и resize()
Модификатор resize()
OpenSCAD предлагает ряд модификаторов, которые позволяют изменять размеры объектов. Один из таких модификаторов – resize([x,y,z],auto,convexity).
Команда resize() используется для изменения размера объекта в трехмерном пространстве. Параметры функции задают новые размеры по осям x, y и z соответственно.
//Оригинальный куб
color ("red", 0.5)
cube([10, 10, 10]);
// Отраженная и отмасштабированная копия
mirror (1,0,0)
resize([12, 5, 3])
cube([10, 10, 10]);

Функция resize([15, 5, 3]) увеличит объект вдоль оси x до 15 единиц, по оси y уменьшит до 5 единиц и по оси z уменьшит до 3 единиц ( желтый прямоугольник). То есть, таким образом мы получаем подогнанный под определенный размер оригинальный объект (красный прямоугольник).
Параметр auto определяет автоматическое масштабирование объекта. Если он установлен в true (по умолчанию), то OpenSCAD самостоятельно подберет размеры таким образом, чтобы сохранить пропорции объекта при изменении его размеров.
Параметр convexity определяет гладкость поверхности объекта. Чем больше значение convexity, тем более гладкая будет поверхность. Например, resize([10, 5, 3], true, 5) изменит размеры объекта с автоматическим масштабированием и поверхностью с высокой степенью гладкости.
Таким образом, модификатор resize() является полезным инструментом в OpenSCAD для изменения размеров объектов и управления качеством их поверхности.
Когда применять функцию?
- создание измененной по размеру копии объекта,
- подгонка индивидуальных параметров объектов при создании подвижных соединений при одномоментной печати ( т.н. Flexi-toys)
Вы можете использовать эту функцию с различными параметрами для достижения нужного результата в своих проектах.
Модификатор масштабирования scale()
Модификатор scale([x,y,z]) в OpenSCAD позволяет изменять размеры объектов по каждой из осей. Этот модификатор принимает три параметра: x, y и z, которые определяют коэффициенты масштабирования для соответствующих осей.
Пример использования модификатора scale().
// Оригинальный куб
color("red")
cube(10);
// Отзеркаленный по осям X и Y, отмасштабированный куб
mirror(1,1,0)
scale([0.5,2,1]) //Этот пример уменьшит объект вдоль оси X в два раза, увеличит по оси Y в два раза, оставив размеры по оси Z без изменений.
cube(10);

Модификатор scale() иногда удобно использовать и в режиме модификатора mirror():
//отражает объект относительно плоскости XY
scale([1,-1,-1]) cube(10);

Этот пример отражает объект относительно плоскости XY. Он не меняет размеры объекта, но инвертирует его положение по осям Y и Z.
Модификатор scale([x,y,z]) может быть полезен при создании деталей с заданными пропорциями или при трансформации уже существующих моделей. Используя различные значения коэффициентов масштабирования для каждой из осей, вы можете достичь нужного эффекта и получить желаемый результат.
Модификаторы трансформаций
Модификатор матрицы трансформаций multmatrix()
Multmatrix(m) – это модификатор, который позволяет применить матрицу трансформации к объекту в OpenSCAD. Матрица трансформации может включать такие операции, как перемещение, масштабирование и поворот объекта.
По своей природе функция multmatrix(m) изменяет геометрию всех дочерних элементов объекта умножением на заданную матрицу аффинного преобразования, где матрица равна 4 × 3 – вектор из 3-х рядных векторов по 4 элемента в каждом или матрица 4 × 4 с 4-й строкой, всегда принудительно равной [0,0,0,1].
Например, матрица представлена следующей записью:
multmatrix (m = [ [1, 0, 0, 25], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) cube([10,10,10]);
Такая запись означает, что все точки куба перемещаются по оси Х на 25единиц:

Расшифровка смысла данной матрицы, представлена ниже:
| [1, 0, 0, 40] | [Масштаб X] | [Сдвигать X вдоль Y] | [Сдвигать X вдоль Z] | [Переместить X] |
| [0, 1, 0, 0] | [Сдвинуть Y вдоль X] | [Масштаб Y] | [Сдвигать Y вдоль Z] | [Переместить Y] |
| [0, 0, 1, 0] | [Сдвинуть Z вдоль X] | [Сдвинуть Z вдоль Y] | [Масштаб Z] | [Переместить Z] |
| [0, 0, 0, 1] | 0 | 0 | 0 | 1 |
Четвертая строка принудительно вводится как [0,0,0,1] и может быть опущена, если вы не объединяете матрицы перед передачей в multmatrix, поскольку она не обрабатывается в OpenSCAD.
Каждая матрица воздействует на точки данной геометрии так, как если бы каждая вершина была вектором из 4 элементов, состоящим из трехмерного вектора с неявным 1 в качестве его 4-го элемента, такого как v= [x, y, z, 1]. Роль неявной четвертой строки m заключается в сохранении неявного значения 1 в 4-м элементе векторов, что позволяет выполнять преобразования. Таким образом, операция multmatrix выполняет m * v для каждой вершины v. Любые элементы (кроме 4-й строки), не указанные в m, рассматриваются как нули.
Пример использования функции multmatrix(m):
1. Перемещение объекта – переместить куб на (10,5):
// переместить куб на (10,5,0)
// аналогично translate([10,5,0]) cube(10);
multmatrix(m = [ [1, 0, 0, 10], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1] ]) cube(10);
2. Масштабирование объекта:
// масштабировать куб в 2 раза по оси X и Y
// аналогично scale([2,2,1]) cube(10);
multmatrix(m = [ [2, 0 , 0 , 0 ], [0 , 2 , 0 , 0 ], [0 , 0 , 1 , 0], [0, 0, 0, 1] ]) cube(10);
3. Поворот объекта:
// повернуть куб на 45 градусов по оси X
// аналогично rotate([45, 0, 0]) cube(10);
angle=45;
multmatrix(m = [ [1, 0, 0, 0],
[ 0, cos(angle), -sin(angle), 0],
[ 0, sin(angle), cos(angle), 0],
[ 0, 0, 0, 1]
]) cube(10);
Multmatrix(m) является мощным инструментом для трансформации объектов в OpenSCAD. Он позволяет создавать сложные и уникальные модели, изменяя их положение, размеры и ориентацию, однако одновременно он является сложным для понимания, если Вы плохо разбираетесь в матрицах.
Данная функция будет рассмотрена более подробно в отдельной статье.
Модификатор отступа offset()
Функции offset(r|delta,chamfer) являются модификаторами в OpenSCAD, которые позволяют изменять форму объектов за счет модификации контура объекта. Offset используется только для 2D объектов.
Первый параметр функции может быть задан либо радиусом (r), либо смещением (delta). Радиус определяет расстояние, на которое будет выпуклая или вогнутая оболочка объекта. Смещение задает точное значение смещения без учета геометрической формы.
Второй параметр chamfer определяет скругление углов объекта. Если он равен нулю, углы останутся острыми. Если значение больше нуля, то углы будут скруглены соответствующим радиусом.
Пример использования функции offset():
// Offset используется только для 2D Фигур
//пример с положительным радиусом
color("red", 1) cube([20,20,1]);
offset(r = 10) square(20);
//пример с положительной дельтой
translate ( [50, 0 ,0]) {
color("red", 1) cube([20,20,1]);
offset(delta = 10) square(20);
}

В данном примере создается квадрат со стороной 20 единиц. Слева к нему применяется offset с параметром r =10 – получаем квадрат со скругленными углами, размеры которого 10+20+10 на 10+20+10, т.е. 40 на 40 единиц. К правому квадрату применяется параметр Delta =10 – получаем квадрат с прямыми углами также 40 на 40 единиц
При использование отрицательных параметров offset, мы получаем уменьшение размеров фигуры, однако в данной ситуации на скругление углоб будет оказывать параметр chamfer:

Положительные значения r/delta. Черный многоугольник является входными данными для операции offset().

Отрицательные значения r/delta. Черный многоугольник является входными данными для операции offset().
Модификатор общей оболочки hull()
Модификатор hull() в OpenSCAD используется для создания объединенной формы из нескольких объектов. Он работает путем соединения вокруг объектов, чтобы образовать новую форму, которая охватывает все исходные объекты.
Пример использования модификатора hull():
1. Объединение двух сфер:
// объединяем две сферы общей оболочкой
//обратите внимание на $fn - это параметр, который задает сглаженность фигуры, чем выше сглаженность, тем тяжелее просчитывать преобразования фигуры
hull(){
sphere (r=10, $fn=360);
translate([10,10,0]) sphere (r=10, $fn=36);
}

В результате выполнения этого скрипта будет создано новое овоидное тело, которое охватывает обе сферы.
2. Использование модификатора hull() для объединения сложных фигур:
hull(){
cube(10);
translate([15,15,15]) sphere (r=5, $fn=36);
}

Этот пример демонстрирует использование модификатора hull() для объединения цилиндра и куба. В результате получается новая форма, которая охватывает оба объекта.
Модификатор hull() в OpenSCAD предоставляет удобный способ создания сложных форм из нескольких объектов. В этом случае достаточно поставить все объекты в определенных точках и объединить общей оболочкой.
Модификатор minkowski()
Модификатор Minkowski в OpenSCAD cоздаёт объект из суммы векторов двух фигур, т.н. сумму Минковского. Например, для следующей сферы и квадрата, мы получим следующее преобразование:
- 1. Оригинальные сфера и квадрат ( из предыдущего примера с hull())
cube(10);
translate([15,15,15]) sphere (r=5, $fn=36);

- 2. Сумма минковского сферы и квадрата ( из предыдущего примера с hull()):
minkowski(){
cube(10);
translate([15,15,15]) sphere (r=5, $fn=36);
}

В данном примере мы создаем объединение куба и сферы с помощью модификатора Minkowski. Значение параметра convexity задает степень детализации выпуклого объекта при выполнении операции. Чем больше значение этого параметра, тем более подробный результат получится.
Чтобы более проще представить сумму Минковского, достаточно разбить сферу на 8 сегментов и поместить их в углах куба:

Использование модификатора Minkowski позволяет получать сложные формы и структуры путем комбинирования искажения выпуклого объекта вокруг других объектов. Это полезно при создании сложных 3D-моделей, таких как органические формы или детали со сложной геометрией.
Вместо заключения: порядок имеет значение!
Обратите внимание, что порядок модификаторов может иметь значение. Действие модификатора распространяется на все следующие за ним модификаторы.
Сравните следующие два варианта:
translate([10, 10, 0])
cube([10, 10, 10]);
color ("red", 1)
mirror([1,1,0])
translate([10, 10, 0])
cube([10, 10, 10]);

translate([10, 10, 0])
cube([10, 10, 10]);
color ("red", 1)
translate([10, 10, 0])
mirror([1,1,0])
cube([10, 10, 10]);

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







