вторник, 19 ноября 2013 г.

OpenSCAD - Введение

OpenSCAD - это программа твердотельного 3D моделирования, которая очень популярна среди RepRap сообщества. Принцип ее работы основан на написании алгоритма отрисовки 3D объекта.

OpenSCAD

Для начала нужно настроить наше рабочее пространство, как это сделать и облегчить себе работу в OpenSCAD читайте здесь.
Теперь удобно расположите ваши руки на клавиатуре и мы начнем.
Весь код мы будем вводить в окне Sublime Text и по нажатию Ctrl+S он будет отображаться в окне OpenSCAD. Но вы также можете обойтись и одним OpenSCAD, в этом случае вводите код в окно редактора OpenSCAD.


OpenSCAD использует С++-подобный язык программирования для создания модели, которая отображается на экране.

Отобразить оси


Первое что мы сделаем так это включим отображение осей в рабочем пространстве OpenSCAD для того чтобы проще было ориентироваться в пространстве, меню View - Show Axes.

OpenSCAD Show Axes

Куб и Перемещение


Куб в OpenSCAD относится к прямоугольной призме. Чтобы создать куб введите:
cube(5);
Куб в OpenSCAD

Мы также можем отобразить куб в центре координат:
cube(5, center=true);

Куб с разными сторонами отображается следующей командой, где размер указывается в формате [x,y,z]:
cube([2,2,5], center=true);
Куб с разными сторонами в OpenSCAD

Чтобы переместить объект используется команда translate([x,y,z]), например переместим предыдущий куб на 2 по Х, на 2 по У и на 10 по Z:
translate([2,2,10]) cube([2,2,5], center=true);
Перемещение куба в OpenSCAD

Если нужно переместить группу объектов то эта группа заключается в фигурные скобки, например так:
translate([2,2,10]) {
       cube([2,2,5], center=true);
       //......
}
В OpenSCAD все что идет после символов // является комментарием и не учитывается интерпретатором OpenSCAD при генерации 3D модели, в них можно писать пометки в вашем коде чтобы потом легче было разобраться в нем, особенно когда код будет очень большим и сложным.

Перемещать естественно можно и в отрицательные полуоси, например:
translate([2,-2,-10]) {
       cube([2,2,5], center=true);
       //......
}
Перемещение куба в OpenSCAD

А теперь сделаем модель буквы "П"
translate([2.5,0,2.5]) cube([2,2,5], center=true); //правая нога
translate([-2.5,0,2.5]) cube([2,2,5], center=true); //левая нога
translate([0,0,5]) cube([7,2,2], center=true); //перекладина
Буква "П" из кубиков в OpenSCAD

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

Переменные


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

Переменная определяется следующим образом:
parameter = 10;
В OpenSCAD нельзя переопределять переменные, т.е. переменная должна быть задана только один раз, и она будет равна последнему присвоенному значению по всему тексту скрипта, например:
a = 10;
echo(a);

a = 15;
echo(a);
Даст следующий результат:
ECHO: 15
ECHO: 15
А теперь давайте сделаем ту же модель буквы "П" с применением переменных:
depth = 2; //глубина модели по оси Y
weight_leg = 2; //ширина ноги по оси X
height_leg = 5; //высота модели по оси Z
legs_space = 5; //расстояние между осями ног по X
weight_bridge = legs_space + weight_leg; //ширина перекладины равна расстоянию между осями ног плюс ширина ноги
height_bridge = weight_leg; //высота перекладины равна ширине ноги

translate([legs_space/2,0,height_leg/2]) //перемещаем правую ногу вправо по X
    cube([weight_leg,depth,height_leg], center=true); //правая нога
translate([-(legs_space/2),0,height_leg/2]) //перемещаем левую ногу влево по X
    cube([weight_leg,depth,height_leg], center=true); //левая нога
translate([0,0,height_leg + height_bridge/2]) //перемещаем перекладину вверх по Z
    cube([weight_bridge,depth,height_bridge], center=true); //перекладина
Параметры в OpenSCAD

Попробуйте поэкспериментировать с различными значениями параметров.
Как видите теперь намного проще изменять модель.

Теперь давайте взглянем на другие формы которые вы можете использовать в OpenSCAD.

Сфера


Простая сфера (шар) может быть определена командой:
sphere(r=5);
Сфера в OpenSCAD

Вы можете управлять разрешением сферы и других форм при помощи параметра $fn. Разрешение можно задать как для всего скрипта:
$fn = 50;
Так и для конкретной формы которая позволяет использовать этот параметр:
sphere(r=5, $fn = 50);
Разрешение сферы в OpenSCAD

На время проектирования рекомендуется использовать разрешение 20-40, а при компиляции и прорисовке готовой модели 100-150, потому что чем выше разрешение тем дольше будет проходить компиляция и тем больше понадобится памяти OpenSCAD.


Цилиндр и Вращение


Для цилиндра нужно указать два параметра, радиус и высоту, а также можно указать разрешение как для сферы и положение относительно центра как для куба:
cylinder(r=5, h=5, center=true, $fn = 50);
Цилиндр в OpenSCAD

Цилиндр создается в вертикальном положении, а если нам он нужен в горизонтальном положении то мы воспользуемся функцией вращения rotate([x,y,z]), где x,y,z - это угол на который нужно повернуть относительно соответствующей оси. Например повернем цилиндр на 90° относительно оси Y:
rotate([0,90,0]) cylinder(r=5, h=5, center=true, $fn = 50);
Вращение в OpenSCAD

А теперь повернем и переместим цилиндр одновременно:
translate([0,0,5]) rotate([0,90,0]) cylinder(r=5, h=5, center=true, $fn = 50);
Этот код можно написать и подругому:
translate([0,0,5]) {
    rotate([0,90,0]){
        cylinder(r=5, h=5, center=true, $fn = 50);
    }
}
Одновременный поворот и перемещение в OpenSCAD

Из цилиндра можно получить конус задав разные диаметры сверху и снизу:
cylinder(r1=20, r2=3, h=40, center=true, $fn=50);
Конус в OpenSCAD

Где r1 - диаметр основания, а r2 - диаметр вершины. Вы также можете получить идеальный конус задав диаметр r2 равным нулю.

Объединение и Вырезание

Объединение неявно когда не используется. Но оно необходимо, например когда необходимо вырезать один объект из группы объектов. Пример объединения:
union() {
    cylinder (h = 4, r=1, center = true, $fn=100);
    rotate ([90,0,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
}
Объединение в OpenSCAD

Все что мы рассмотрели ранее позволяет создавать объекты сложной формы посредством добавления небольших частей друг к другу. Но очень часто нам нужно вырезать какую-то часть. И рассмотрим мы это на примере создания кольца. В функции вырезания из первого объекта вырезаются все последующие:
$fn = 50;

difference() {
    // Из этого цилиндра мы будем вырезать
    cylinder(r=10, h=5, center=true);

    // Все остальное следующее далее будет вырезано
    cylinder(r=8, h=6, center=true);
}
Вырезание в OpenSCAD

Иногда очень удобно видеть что мы вырезаем и в этом случае можно использовать специальный знак #, который делает видимым вырезаемую часть:
$fn = 50;

difference() {
    // Эта часть будет создана
    cylinder(r=10, h=5, center=true);

    // Все остальное следующее далее будет вырезано
    #cylinder(r=8, h=6, center=true);
}
Видимое вырезание в OpenSCAD

Вырезаемая часть всегда должна быть немного больше. Например в рассмотренном выше примере, если между внешним и внутренним цилиндрами не будет перекрытия мы получим "оболочку" равную нулю. Это плохой стиль 3D моделирования, и может привести к ошибкам при генерации модели (рендеринг) или отправке модели в 3D принтер.

Ошибка вырезания в OpenSCAD

Поэтому всегда учитывайте это и делайте вырезаемый объект немного выступающим, 0.1мм достаточно.

А теперь используем объединение и вырезание в одном примере, чтобы наглядно показать как вырезать из группы объектов:
difference() {
    union() {
        cylinder (h = 4, r=1, center = true, $fn=100);
        rotate ([90,0,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
    }
    rotate([0,90,0]) cylinder(r=1, h=10, center=true, $fn=100);
}
Вырезание и объединение в OpenSCAD


Модули


Модули являются мощным средством в OpenSCAD, они позволяют упростить и повторно использовать однажды написаный код.
Сделаем ранее рассмотренную модель буквы "П" с использованием модуля:
// Инструкции как должна создаваться буква "П"
module pi() {
    // Параметры
    depth = 2; //глубина модели по оси Y
    weight_leg = 2; //ширина ноги по оси X
    height_leg = 5; //высота модели по оси Z
    legs_space = 5; //расстояние между осями ног по X
    weight_bridge = legs_space + weight_leg; //ширина перекладины равна расстоянию между осями ног плюс ширина ноги
    height_bridge = weight_leg; //высота перекладины равна ширине ноги

    translate([legs_space/2,0,height_leg/2]) //перемещаем правую ногу вправо по X
        cube([weight_leg,depth,height_leg], center=true); //правая нога
    translate([-(legs_space/2),0,height_leg/2]) //перемещаем левую ногу влево по X
        cube([weight_leg,depth,height_leg], center=true); //левая нога
    translate([0,0,height_leg + height_bridge/2]) //перемещаем перекладину вверх по Z
        cube([weight_bridge,depth,height_bridge], center=true); //перекладина
}

// Эта строчка говорит OpenSCAD найти инструкции как создавать букву "П" и создать ее
pi();
Модули в OpenSCAD

А теперь давайте улучшим модуль и будем передавать параметры в него, что позволит повторно использовать модуль с разными размерами, и создадим несколько разных букв "П":
// Инструкции как должна создаваться буква "П"
module pi(depth, weight_leg, height_leg, legs_space) {
    // Параметры
    weight_bridge = legs_space + weight_leg; //ширина перекладины равна расстоянию между осями ног плюс ширина ноги
    height_bridge = weight_leg; //высота перекладины равна ширине ноги

    translate([legs_space/2,0,height_leg/2]) //перемещаем правую ногу вправо по X
        cube([weight_leg,depth,height_leg], center=true); //правая нога
    translate([-(legs_space/2),0,height_leg/2]) //перемещаем левую ногу влево по X
        cube([weight_leg,depth,height_leg], center=true); //левая нога
    translate([0,0,height_leg + height_bridge/2]) //перемещаем перекладину вверх по Z
        cube([weight_bridge,depth,height_bridge], center=true); //перекладина
}

// Эта строчка говорит OpenSCAD найти инструкции как создавать букву "П" и создать ее
pi(2,2,5,5);
translate([10,0,0]) pi(1,3,7,4);
translate([-10,0,0]) pi(4,1,2,5);
Модули с параметрами в OpenSCAD

Модули незаменимы когда вы работаете с функциями которые должны повторно использоваться в вашей модели.

Вот мы и рассмотрели основные функции OpenSCAD, которые позволят вам создавать ваши 3D модели в такой замечательной программе твердотельного 3D моделирования как OpenSCAD.

Продолжение следует...


При копировании ссылка на источник обязательна.