Урок: как сделать кружку в OpenScad

OpenScad - модель кружки

тот код — параметрическая модель кружки в OpenSCAD. Я по шагам разберу, что именно он делает и как устроен.


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();

Здесь используется два ключевых приёма:

  1. difference() — булева операция: из первой (внешней) фигуры вычитаются все последующие.
  2. Потом уже отдельно добавляется ручка 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 строится через поворотную экструзию:

  1. circle(r = r) — окружность радиуса r (это сечение тора).
  2. translate([R, 0, 0]) — перенос этой окружности на расстояние R от начала координат по оси X.
  3. rotate_extrude(angle = 360) — вращаем эту окружность вокруг оси Z на 360°, в результате получается тор.

Параметры:

  • R — расстояние от центра до центра окружности (большой радиус тора).
  • r — радиус самой окружности (толщина “трубки”).

6. Итоговая логика модели

Всё вместе модель работает так:

  1. Строится один большой цилиндр — внешний корпус кружки с дном.
  2. Из него вырезается внутренний цилиндр поменьше, расположенный выше плоскости дна: получается полость и дно нужной толщины.
  3. Отдельно сбоку строится тор (ручка), повёрнутый и перенесённый так, чтобы он касался боковой поверхности кружки.
  4. Из внешнего тора ручки вырезают внутренний тор поменьше, чтобы сделать более аккуратную форму.
// ----------------------
// Параметры кружки
// ----------------------

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% заполнение фигуры.

Оцените статью
( 1 оценка, среднее 5 из 5 )
Добавить комментарии

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Урок: как сделать кружку в OpenScad
Разница между модулем и функцией в OpenSCAD