Урок 1

OpenSCAD

Урок 1. Обучение 3D моделированию. Изучаем основные функции (команды) языка. Разбираем пример модели.

OpenSCAD - построение графических примитивов: куб, параллелепипед, сфера, цилиндр, конус, многогранник.

Параллелепипед с длинами сторон по X, Y, Z соответственно 10, 20, 30 в мм:

cube( size=[10,20,30], center=true );

true/false - располагать по центру или в положительных полуосях. Короткие варианты написания кода:

cube( [10, 20, 30], true );
cube( [10, 20, 30] );

если последний параметр не указан принимает значение false

a = [10, 15, 20]; cube(a);

здесь a - параметр (матрица) содержит в себе значение сторон

cube( 5 );

куб стороной 5мм в положительных полуосях;

Сфера радиусом 8 мм, с разным разрешением $fn.

sphere(r=8, $fn=100); // Полное написание
sphere(8, $fn=20); // Короткое написание
sphere(8, $fn=4);
sphere(8, $fn=5);

Центр сферы всегда в начале координат.

Вместо $fn можно задать параметр $fa - угловое разрешение и $fs - размер грани в мм.

sphere(d=16, $fn=100); // Задать сферу через диаметр

Через цилиндр можно задать конус, усечённый конус, пирамиду, усечённую пирамиду. Первый параметр высота цилиндра, следующие это нижний радиус, верхний радиус, центровка и число граней $fn.

cylinder(h=10, r1=8, r2=5, center=true, $fn=100); // полное написание
cylinder(10, 8, 0, true, $fn=100); // краткое написание
cylinder(10, 8, 8, true, $fn=100);
cylinder(10, 8, 5, true, $fn=4);

Варианты написания:

cylinder(h=10, d1=16, d2=10, true, $fn=100);// через диаметры оснований
cylinder(h=10, r1=8, d2=10, true, $fn=100);// через радиус и диаметр онований
cylinder(h=10, r=8, true, $fn=100);// если нужен просто цилиндр

Многогранник.

Через эту функцию можно задать любую поверхность. На практике используется редко. Почему? Думаю поймёте сами.

Постройка пирамиды.

Что требуется? Задать все вершины фигуры (points) в координатах [x, y, z]. Затем объединить в группу по 3 - получить треугольники, играющие роль граней (faces) многогранника.

polyhedron(
  points=[ [10,10,0], [10,-10,0], [-10,-10,0], [-10,10,0], [0,0,10] ],
  faces=[ [0,1,4], [1,2,4], [2,3,4], [3,0,4], [1,0,3], [2,1,3] ]            
);

Точки (points) с координатой z=0 - это вершины основания пирамиды, a последняя с x=0, y=0, z=10 - это пик пирамиды.

Грани (faces) [0,1,4], [1,2,4], [2,3,4], [3,0,4] - это боковые треугольные грани, а последние две [1,0,3], [2,1,3] задают квадрат основания. Цифры в квадратных скобках, говорят какие точки объединить. Соответственно точки по порядку их следования 0 -> [10,10,0] , 1 -> [10,-10,0] и т.д.

OpenSCAD основные операции, действия с объектами.

Перемещение объекта на x=10, y=10, z=0 относительно центра координат:

translate([10,10,0]) cube(10, true);

Если нужно переместить группу объектов заключаем их в фигурные скобки:

translate([10,10,0]) {/*Здесь код группы*/};

Применение нескольких вложенных переносов:

translate([10,10,0]) {
  cube(10, true);
  translate([0,0,5]) sphere(5, $fn=50);
};

Эквивалент примера выше:

translate([10,10,0]) cube(10, true);
translate([10,10,5]) sphere(5, $fn=50);

Вращение.

На 75 градусов вокруг оси X:

rotate([75,0,0]) cube(10, true);

Вращение группы объектов:

rotate([75,0,0]){/*Здесь код группы*/};

Вращение + перемещение.

Две нижние строчки:

color([0,1,1]) translate([0,0,15]) rotate([75,0,0]) cube(10, true);
color([1,0,1]) rotate([75,0,0]) translate([0,0,15]) cube(10, true);

Дают разные результаты. Имеет значение последовательность действий. Бирюзовый куб сначала повёрнут на 75 градусов вокруг оси X, а потом смещён на 15 мм по оси z. Сиреневый куб сначала смещён на 15 мм, а потом повёрнут.

Сложение (объединение).

union(){
  cylinder(30, 5, 5, true, $fn=50);
  rotate([60,0,0]) cylinder(30, 5, 5, true, $fn=50);
};

Любое количество простых или сложных объектов в фигурных скобках будут объединены.

Вычитание (разность).

Из простого объекта указанного первым будут вычитаться все что указано ниже него.

difference(){
  cylinder(30, 5, 5, true, $fn=50);
  rotate([60,0,0]) cylinder(30, 5, 5, true, $fn=50);
};

Из составного объекта указанного первым будут вычитаться все что указано ниже него.

difference(){
  union(){cylinder(30, 5, 5, true, $fn=50); cube(10, true);};
  rotate([60,0,0]) cylinder(30, 5, 5, true, $fn=50);
};

Произведение (пересечение). У объектов внутри фигурных скобок находится общая часть - она и остаётся.

intersection(){
  cylinder(30, 5, 5, true, $fn=50);
  rotate([60,0,0]) cylinder(30, 5, 5, true, $fn=50);
};

Чтобы сделать объект видимым или прозрачным при вычитании или пересечении, достаточно поставить решётку перед фигурой, объединением и т.п. Модификатор очень удобен при отладке модели, когда не видно вычитаемых, пересекаемых фигур или если нужно заглянуть внутрь создаваемой модели.

translate([10,0,0]) difference(){
  cylinder(30, 5, 5, true, $fn=50);
  rotate([60,0,0]) #cylinder(30, 5, 5, true, $fn=50);
};

или

translate([-10,0,0]) intersection(){
  #cylinder(30, 5, 5, true, $fn=50);
  rotate([60,0,0]) cylinder(30, 5, 5, true, $fn=50);
};

Сжатие. Растяжение.

scale([2,2,0.5]) sphere(8, $fn=30);

Соответственно по оси X и Y сферу растянули в 2 раза, а по оси Z сжали в 2 раза.

Пример работы в OpenSCAD. Проектируем колесо для детской машинки.

Исходный цилиндр.

cylinder(10, 25, 25, true, $fn=200);

Срезаем острую грани цилиндра - найдя общую часть цилиндра и сплюснутой сферы.

intersection(){
  cylinder(10, 25, 25, true, $fn=200);
  scale([2.5,2.5,1])sphere(10.5, $fn=200);
}; 

Имитируем диск колеса. С боковой поверхности вычитаем сжатую сферу.

difference(){
  intersection(){
    cylinder(10, 25, 25, true, $fn=200);
    scale([2.5,2.5,1])sphere(10.5, $fn=200);
  };
  
  translate([0, 0, 12])
  scale([2.5,2.5,1])sphere(10.5, $fn=200);
};

Вырезаем ось колеса.

difference(){
  intersection(){
    cylinder(10, 25, 25, true, $fn=200);
    scale([2.5,2.5,1])sphere(10.5, $fn=200);
  };

  // боковая сферическая выемка
  translate([0, 0, 12])
  scale([2.5,2.5,1])sphere(10.5, $fn=200);

  // ось колеса
  cylinder(11, 2.5, 2.5, true, $fn=20);
};
    

Имитируем спицы.

Так как спиц будет 12, чтобы не переписывать один и тот же код 12 раз применим - цикл.

Цикл for(i=[1:12]){...};. Внутри фигурных скобок - код который будет повторяться. Переменная i принимает значения от 1 до 12.

difference(){
  intersection(){
    cylinder(10, 25, 25, true, $fn=200);
    scale([2.5,2.5,1])sphere(10.5, $fn=200);
  };

  // боковая сферическая выемка
  translate([0, 0, 12])
  scale([2.5,2.5,1])sphere(10.5, $fn=200);

  // ось колеса
  cylinder(11, 2.5, 2.5, true, $fn=20);

  // спицы
  for(i=[1:12]){
    rotate([0,0,i*30])
    translate([13,0,0])
    scale([3,1,1])
  cylinder(11, 2, 2, true, $fn=50);
  };
};

Аналогично с помощью цикла, добавляем рисунок протектора.

difference(){
  intersection(){
    cylinder(10, 25, 25, true, $fn=200);
    scale([2.5,2.5,1])sphere(10.5, $fn=200);
  };

  // боковая сферическая выемка
  translate([0, 0, 12])
  scale([2.5,2.5,1])sphere(10.5, $fn=200);

  // ось колеса
  cylinder(11, 2.5, 2.5, true, $fn=20);

  // спицы
  for(i=[1:12]){
    rotate([0,0,i*30])
    translate([13,0,0])
    scale([3,1,1])
  cylinder(11, 2, 2, true, $fn=50);
  };

  // протектор
  for(i=[1:36]){
    rotate([0,0,i*10])
    translate([30,0,0])
    scale([3,1,1])
    cylinder(11, 2, 2, true, $fn=50);
  };
};