Найти в Дзене
PixelPulse

3D-моделирование: снежинка в OpenSCAD

Создание снежинки в OpenSCAD — это отличная задача для демонстрации возможностей параметрического проектирования и рекурсии. Снежинки обладают фрактальной структурой и шестикратной симметрией, что идеально описывается циклами и модулями в коде. Ниже приведен пример кода, который создает красивую, геометрически правильную снежинку с использованием рекурсии (фрактальное построение). // --- Настройки снежинки --- depth = 3; // Глубина рекурсии (детализация). Попробуйте значения 1, 2, 3 или 4. arm_length = 40; // Длина основного луча thickness = 2; // Толщина линий branch_angle = 60; // Угол ответвлений (60 градусов для классической формы) // Основной модуль сборки module snowflake() { union() { // Создаем 6 лучей, поворачивая их на 60 градусов for (i = [0:5]) { rotate(i * 60) snowflake_arm(length=arm_length, d=depth); } // Центральная часть (шестигранник), чтобы скрепить лучи // Рад
Оглавление

Создание снежинки в OpenSCAD — это отличная задача для демонстрации возможностей параметрического проектирования и рекурсии. Снежинки обладают фрактальной структурой и шестикратной симметрией, что идеально описывается циклами и модулями в коде.

Ниже приведен пример кода, который создает красивую, геометрически правильную снежинку с использованием рекурсии (фрактальное построение).

Код снежинки (копировать в OpenSCAD):

// --- Настройки снежинки ---
depth = 3; // Глубина рекурсии (детализация). Попробуйте значения 1, 2, 3 или 4.
arm_length = 40; // Длина основного луча
thickness = 2; // Толщина линий
branch_angle = 60; // Угол ответвлений (60 градусов для классической формы)
// Основной модуль сборки
module snowflake() {
union() {
// Создаем 6 лучей, поворачивая их на 60 градусов
for (i = [0:5]) {
rotate(i * 60)
snowflake_arm(length=arm_length, d=depth);
}
// Центральная часть (шестигранник), чтобы скрепить лучи
// Радиус подбираем в зависимости от толщины
circle(r=thickness * 1.2, $fn=6);
}
}
// Рекурсивный модуль одного луча
module snowflake_arm(length, d) {
// 1. Рисуем основной стержень луча
// Используем square вместо circle для более "острого" стиля,
// но можно использовать и cylinder/hull
translate([0, length/2, 0])
square([thickness, length], center=true);
if (d > 0) {
// 2. Рекурсивно добавляем продолжение луча
translate([0, length, 0])
snowflake_arm(length * 0.6, d - 1);
// 3. Добавляем боковые веточки
// Мы используем цикл, чтобы поставить несколько веток вдоль луча
for (pos = [0.4, 0.7]) { // Позиции веток (40% и 70% длины)
translate([0, length * pos, 0]) {
// Ветка вправо
rotate(branch_angle)
snowflake_arm(length * 0.4, d - 1);
// Ветка влево
rotate(-branch_angle)
snowflake_arm(length * 0.4, d - 1);
}
}
}
}
// Визуализация
color("Cyan")
linear_extrude(height = 2) // Делаем объект объемным (высота 2мм)
snowflake();
Снежинка с использованием рекурсии
Снежинка с использованием рекурсии

Как это работает:

  1. Симметрия (6 лучей):
    Основной модуль
    snowflake() использует цикл for (i = [0:5]) и функцию rotate(i * 60), чтобы создать 6 копий одного луча. Это задает шестикратную симметрию, характерную для настоящих снежинок.
  2. Рекурсия (Фрактальность):
    Модуль
    snowflake_arm вызывает сам себя.Сначала он рисует отрезок линии.
    Затем, если глубина
    d больше нуля, он перемещается в конец нарисованного отрезка и рисует следующий, меньший луч.
    Одновременно он рисует боковые ответвления под углом 60 градусов.
  3. Параметризация:
    Вы можете менять переменные в начале кода:
    depth: Увеличьте это число (например, до 4), чтобы снежинка стала очень пушистой и детальной (расчет займет чуть больше времени).
    branch_angle: Измените на 45 градусов, чтобы получить более "острую" звезду.

Советы по печати (если вы хотите это 3D-напечатать):

  • Прочность: Поскольку снежинка имеет тонкие элементы, лучше печатать её из PETG или PLA с небольшой высотой слоя (0.12 - 0.2 мм).
  • Плоскость: Код использует linear_extrude, чтобы превратить 2D-чертеж в 3D-объект. Если вы хотите сделать подвеску, можете добавить отверстие в конце одного из лучей:
// Добавьте это внутрь модуля snowflake_arm при d=0 (кончик луча)
if (d == 0) translate([0, length+1]) circle(d=3);