Урок 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);
};
};