тот код — параметрическая модель кружки в OpenSCAD. Я по шагам разберу, что именно он делает и как устроен.
- 1. Параметры модели
- 2. Основная сборка модели
- 2.1. Формирование корпуса кружки
- 2.2. Добавление ручки
- 3. Модуль mug_body() — корпус кружки
- 4. Модуль mug_handle() — ручка кружки
- 4.1. Позиционирование ручки
- 4.2. Форма ручки
- 5. Модуль torus() — построение тора
- 6. Итоговая логика модели
- 7. Что можно менять в этом коде
1. Параметры модели
В начале задаются параметры, которыми можно удобно управлять формой кружки:
OpenSCAD
Копировать код
// Основные размеры кружки h = 90; // высота цилиндра (стенок) r_outer = 40; // внешний радиус кружки wall = 3; // толщина стенки bottom = 4; // толщина дна
Здесь определяются:
h— высота стенок кружки (без учёта дна).r_outer— внешний радиус кружки (от центра до наружной поверхности).wall— толщина стенки кружки.bottom— толщина дна.
Из этих значений OpenSCAD затем строит полость внутри кружки.
OpenSCAD
Копировать код
// Параметры ручки handle_r_outer = 25; // "радиус" дуги ручки (расстояние от стены кружки до центра сечения ручки) handle_thick = 10; // толщина (диаметр сечения) ручки handle_shift_z = 0; // вертикальный сдвиг ручки относительно середины по высоте
Это параметры ручки:
handle_r_outer— радиус дуги ручки, то есть насколько далеко от кружки отходит центр ручки.handle_thick— толщина ручки (по сути, диаметр её поперечного сечения).handle_shift_z— вертикальный сдвиг ручки: можно поднять или опустить ручку относительно середины кружки.
OpenSCAD
Копировать код
// Качество (гладкость) фигур $fn = 80; // количество сегментов для окружностей (чем больше — тем плавнее)
$fn — глобальный параметр качества для округлых фигур (цилиндров, окружностей и т.д.). Чем больше число, тем более гладкими будут окружности, но рендер будет медленнее.
2. Основная сборка модели
Главная часть:
OpenSCAD
Копировать код
difference() {
// Внешний корпус кружки + дно
mug_body();
// Вырезаем внутреннюю полость
translate([0, 0, bottom])
cylinder(h = h, r = r_outer - wall, center = false);
}
// Добавляем ручку отдельно
mug_handle();
Здесь используется два ключевых приёма:
difference()— булева операция: из первой (внешней) фигуры вычитаются все последующие.- Потом уже отдельно добавляется ручка
mug_handle(), без вычитания.
Разберём подробнее.
2.1. Формирование корпуса кружки
OpenSCAD
Копировать код
difference() {
mug_body();
translate([0, 0, bottom])
cylinder(h = h, r = r_outer - wall, center = false);
}
Внутри difference():
- Сначала идёт
mug_body();— внешний цилиндр (корпус кружки) с дном. - Затем второй объект — внутренний цилиндр, который вырезает полость у кружки (как дырка в стакане).
Перевод translate([0, 0, bottom]) поднимает внутренний цилиндр на высоту дна, чтобы дно не прорезалось насквозь.
Радиус внутреннего цилиндра r = r_outer - wall — это внешний радиус минус толщина стенки, получается внутренний радиус кружки.
Высота внутреннего цилиндра — h, то есть полость по высоте совпадает с высотой стенки, не затрагивая дно.
2.2. Добавление ручки
OpenSCAD
Копировать код
mug_handle();
Ручка добавляется снаружи, уже после операции difference(). То есть она просто “приклеивается” к стороне кружки, не вычитаясь нигде.
3. Модуль mug_body() — корпус кружки
module mug_body() {
// Внешний цилиндр
cylinder(h = h + bottom, r = r_outer, center = false);
}
Модуль — это как функция в OpenSCAD, упакованный блок кода.
Здесь:
- Строится один цилиндр высотой
h + bottom:h— высота стенок.bottom— плюс толщина дна.
- Радиус цилиндра — внешний
r_outer. center = false— цилиндр строится от z = 0 вверх, а не по центру координат.
То есть вся кружка расположена на “столе” (на плоскости z=0), без ухода вниз.
4. Модуль mug_handle() — ручка кружки
module mug_handle() {
// Ручка как "толстое" кольцо, прикреплённое сбоку к стенке
translate([r_outer, 0, handle_shift_z + h/2 - handle_r_outer/2])
rotate([0, 90, 0])
difference() {
// внешний тор
torus(R = handle_r_outer, r = handle_thick/2);
// внутренняя выемка, чтобы ручка была не слишком толстой
torus(R = handle_r_outer - handle_thick/2, r = handle_thick/2 - 1);
}
}
Ручка сделана как тор (кольцо/ободок), выровненный так, чтобы он примыкал к стенке кружки.
4.1. Позиционирование ручки
translate([r_outer, 0, handle_shift_z + h/2 - handle_r_outer/2])
rotate([90, 0, 0])
...
translate([r_outer, 0, ...])— перенос по оси X:r_outer— это радиус кружки, то есть ручка “выносится” вправо от центра, к боковой поверхности кружки.
- По оси Z:
h/2— центр по высоте кружки.handle_shift_z— сдвиг ручки вверх/вниз относительно центра.- handle_r_outer/2— корректировка расположения тора так, чтобы дуга красиво находилась по высоте.
rotate([90, 0, 0]) поворачивает тор так, чтобы он “стоял” боком и торцом прикреплялся к стенке кружки.
4.2. Форма ручки
difference() {
// внешний тор
torus(R = handle_r_outer, r = handle_thick/2);
// внутренняя выемка, чтобы ручка была не слишком толстой
torus(R = handle_r_outer - handle_thick/2, r = handle_thick/2 - 1);
}
Здесь:
- Внешний тор — “толстое” кольцо:
R = handle_r_outer— большой радиус тора (расстояние от центра модели до центра сечения ручки).r = handle_thick/2— малый радиус (толщина сечения ручки).
- Внутренний тор вычитается из внешнего:
R = handle_r_outer - handle_thick/2— немного меньше.r = handle_thick/2 - 1— тоже слегка меньше, чтобы внутри ручки была выемка.
В результате получается не сплошное кольцо, а более “облегчённая” форма ручки с толщиной стенки.
5. Модуль torus() — построение тора
module torus(R = 20, r = 5) {
rotate_extrude(angle = 360)
translate([R, 0, 0])
circle(r = r);
}
Тор (бублик) в OpenSCAD строится через поворотную экструзию:
circle(r = r)— окружность радиусаr(это сечение тора).translate([R, 0, 0])— перенос этой окружности на расстояниеRот начала координат по оси X.rotate_extrude(angle = 360)— вращаем эту окружность вокруг оси Z на 360°, в результате получается тор.
Параметры:
R— расстояние от центра до центра окружности (большой радиус тора).r— радиус самой окружности (толщина “трубки”).
6. Итоговая логика модели
Всё вместе модель работает так:
- Строится один большой цилиндр — внешний корпус кружки с дном.
- Из него вырезается внутренний цилиндр поменьше, расположенный выше плоскости дна: получается полость и дно нужной толщины.
- Отдельно сбоку строится тор (ручка), повёрнутый и перенесённый так, чтобы он касался боковой поверхности кружки.
- Из внешнего тора ручки вырезают внутренний тор поменьше, чтобы сделать более аккуратную форму.
// ----------------------
// Параметры кружки
// ----------------------
h = 120; // высота кружки
r_outer = 50; // внешний радиус
wall = 3; // толщина стенки
bottom = 4; // толщина дна
// параметры ручки
handle_r_outer = 30; // внешний радиус "дуги" ручки
handle_thick = 8; // толщина сечения ручки
handle_shift_z = 10; // смещение ручки по высоте от дна
$fn = 180; // сглаживание (больше — более гладко)
// ----------------------
// Модули
// ----------------------
// Корпус кружки
module mug_body() {
// Внешний цилиндр
cylinder(h = h + bottom, r = r_outer, center = false);
}
// Тор — вспомогательная фигура для ручки
// R — большой радиус (от центра тора до центра сечения)
// r — малый радиус (радиус сечения)
module torus(R = 20, r = 5) {
rotate_extrude(angle = 180)
translate([R, 0, 0])
circle(r = r);
}
// Ручка кружки
module mug_handle() {
// Ручка как "толстое" кольцо, прикреплённое сбоку к стенке
translate([r_outer, 0, handle_shift_z + h/2 - handle_r_outer/2])
rotate([90, 90, 0])
difference() {
// внешний тор
torus(R = handle_r_outer, r = handle_thick/2);
// внутренняя выемка, чтобы ручка была не слишком толстой
torus(R = handle_r_outer - handle_thick/2, r = handle_thick/2 - 1);
}
}
// ----------------------
// Основной вызов
// ----------------------
difference() {
// Тело кружки (с дном)
mug_body();
// Полость внутри
translate([0, 0, 5])
cylinder(h = h, r = r_outer - wall, center = false);
}
// Добавляем ручку отдельно
mug_handle();
7. Что можно менять в этом коде
Любой из параметров в начале:
- Увеличить
h— будет более высокая кружка. - Увеличить
r_outer— более широкая кружка. - Изменить
wallиbottom— толщина стенок и дна. - Изменить
handle_r_outerиhandle_thick— размер и форма ручки. - Изменять
handle_shift_z— поднять/опустить ручку.
Данная модель кружки имеет параметрический характер и может быть использована для печати из экологически безопасных пластиков для пищевого применения. В этом случае рекомендуем 100% заполнение фигуры.







