В данной статье я бы хотел поделиться опытом использования бесплатной программы OpenSCAD, для 3д моделирования предоставленной на картинке фигурки.
Будет показан пошагово весь путь моделирования и готовая, напечатанная 3д деталька в конце.
С помощью этой детальки можно подвесить сд-диск на нитке. Пользы для человечества планеты не так много, но благодаря решению этой хобби-задачи я (впервые) попробовал OpenSCAD, и за пол-часа «с нуля» нарисовал 3д модель.
OpenSCAD — это бесплатная и открытая программа для 3д моделирования, но в отличие от других 3д программ, мышка в ней используется только лишь для просмотра готовой детали, а само рисование происходит на базе составленной программы на языке OpenSCAD.
Суть программы на языке OpenSCAD достаточно простая — в ней мы даем команды на рисование геометрических примитивов, над которыми мы можем выполнять операции вращения, перемещения, масштабирования. И плюсом к этому можем осуществлять «арифметические» команды над фигурами, например, сложение, вычитание.
Простая иллюстрация идеи:
нарисовать куб со стороной 10 мм
нарисовать сферу радиусом 10 мм
вычесть из куба сферу
И мы получим такой результат:
Установка OpenSCAD
Для установки — скачиваем версию для вашей ОС с официального сайта (http://www.openscad.org/). В данный момент версия от 03.2014.
После старта программы мы увидим 2 области:
Cлева — для ввода программы на языке OpenSCAD,
Cправа — результат отрисовки.
Для отрисовки программы надо нажать F5, для полноценного рендеринга — F6.
Отмечу, что при открытии файла — его не обязательно редактировать в среде OpenSCAD, вы можете его редактировать в вашем любимом текстовом редакторе, для отрисовки в опенскад при редактировании внешним редактором — необходимо нажимать F4.
Hello World
Попробуем нарисовать куб: cube();
Пишем в левой, текстовой зоне (10 — это сторона куба):
cube(10);
Обратим внимание, что каждая строчка в программе заканчивается точкой с запятой.
Нажимаем F5, видим справа — куб — можем вращать его захватив мышкой, роликом увеличивать/уменьшать, и правая кнопка для перемещения точки просмотра.
И попробуем нарисовать сферу, команда: sphera(10)
cube(10);
sphera(10);
Просматриваем результат F5:
Теперь добавим команда вычитания:
difference() { OBJ1; OBJ2;}
.
Команды пишутся как вызов функции, если параметров нет, то пустые скобки, и далее те объекты или объект к которым надо применить эту функцию.
Вот как будет выглядеть вычитание
difference(){
cube(10);
sphere(10);
}
И вот результат:
Основы думаю понятны.
Теперь вернемся к нашей основной задаче.
Моделирование подвеса
Чтобы CD-диск висел на нити, в горизонтальном положении:
- Должно быть что-то куда можно закрепить нить
- Диск должен на что-то опираться
- Точка крепления нити должна быть по центру диска, при взгляде сверху, и должна быть выше плоскости при взгляде сбоку
Начнем с точки крепления нити, а точнее того, что находится между ней и основанием диска.
Моделирование крестовины
Я решил выполнить этот фрагмент в виде крестовины, которая вверх идет как усеченная пирамида.
Ок, в начале делаем крестовину.
Для этого рисуем два прямоугольный параллелепипеда, перпендикулярные друг другу.
Примечание: для простоты текста — буду называть «прямоугольный параллелепипеда» — «кубоид», то есть это вариация куба.
При рисовании фигур, по умолчанию они идут от центра, в положительные стороны осей X, Y, Z. Это можно увидеть в нашем первом примере — и куб был нарисован в положительной зоне (тогда как сфера изначально рисуется в центре координат).
Но есть вариант, когда центр нарисованной фигуры будет находиться в центре координат. Для этого надо использовать атрибут,
center = true
.
Настал момент задуматься о размерах. Диаметр внутреннего отверстия CD-диска — 15 мм. Значит крестовина внизу должна быть не более 15 мм, для запаса возьмем 14 мм.
Первая часть крестовины:
cube([14,1,15], center=true);
Получилось:
Если мы указываем каждую стенки «куба», то мы должны использовать запись [x, y, z]
, вторым параметром (center=true) мы указали что «кубоид» будет нарисован в центре координат.
Мы указали:
14 — это ширина «кубоида» — оно должно быть не больше 15 мм — внутреннего отверстия CD-ROM диска.
1 — толщина стенки,
15 — это высота «кубоида», т.к. он по центру Z, то в верхней части будет 15/2 = 7.5 мм — это будет высота до точки крепления.
Далее нам нужна вторая часть крестовины, для этого нам нужно тот же «кубоид» повернуть на 90 градусов, относительно оси Z.
Функция поворота выглядит как: rotate(a = deg, v = [x, y, z]) { ... }
Где в параметрах функции указывается угол поворота (a), и вектор (v) относительно которого поворот совершается.
Вот так будет выглядеть программа:
cube([14,1,15], center=true);
rotate(a=90, v=[0,0,1]){
cube([14,1,15], center=true);
}
И результат
Теперь нам надо убрать лишнюю часть, что находится под нулевой плоскостью (внизу).
Для этого мы можем нарисовать внизу куб, и вычесть его из нашей фигуры. Но куб будет нарисован в центре, нам необходимо сдвинуть его вниз.
Команда перемещения выглядит так: translate(v = [x, y, z]) { ... }
Где в параметрах указывается вектор (v) на который необходимо сдвинуть объект (указанный в теле функции).
Куб рисуем со стороной 15 мм, и сдвигаем вниз на 15/2 мм (да можно указывать математические операции) — он оказывается полностью под плоскостью.
Вот обновленный код:
cube([14,1,15], center=true);
rotate(a=90, v=[0,0,1]){
cube([14,1,15], center=true);
}
translate(v=[0,0,-15/2]){
cube(15, center=true);
}
И вот результат:
Теперь применяем уже известную нам команду вычитания — нам надо вычесть из крестовины, куб. Но проблема — для вычитания нужно два объекта — у нас три — два «кубоида» (крестовина), и куб.
Для этого используем команду объединения: union(){ OBJ1; OBJ2; ... }
.
Получается следующий код (с объединением и вычитанием):
difference(){
union(){
cube([14,1,15], center=true);
rotate(a=90, v=[0,0,1]){
cube([14,1,15], center=true);
}
}
translate(v=[0,0,-15/2]){
cube(15, center=true);
}
}
Результат
Крестовина получилась, теперь надо сделать ее пирамидальной.
Для этой цели нам бы подошел конус, и операция «пересечения» когда остается лишь та часть фигур, которая совпадает у обоих фигур.
Но команды для рисования конуса нет в OpenSCAD.
Зато есть команда рисования цилиндра: cylinder(h = 10, r = 10, [r2 = 20,]);
где кроме базовых двух параметров (для получения цилиндра) — радиус основания [r] и высоты [f] есть третий [r2] — радиус вершины, с помощью которого можно нарисовать конус, если выставить в 0. Или усеченный конус — если выставить значение не равное радиусу основания.
Это то, что нам нужно.
Определимся с размерами, основание конуса в диаметре должно быть 14, то есть радиус 7. Высота 15/2 мм. Радиус верхнего основания пусть будет 1мм, сам размер будет 2мм, на нем мы разместим ушко для нити.
Мы будем рисовать конус в центре координат, поэтому надо будет поднять вверх на половину высоты (15/4).
Фрагмент:
translate(v=[0,0,7/2]){
cylinder(h=7, r=7, r2=2, center=true);
}
Вот как он выглядит:
Результирующий код:
difference(){
union(){
cube([14,1,15], center=true);
rotate(a=90, v=[0,0,1]){
cube([14,1,15], center=true);
}
}
translate(v=[0,0,-15/2]){
cube(15, center=true);
}
}
translate(v=[0,0,15/4]){
cylinder(h=15/2, r=7, r2=2, center=true);
}
И результат:
Обратим внимание, что из-за нарисованного конуса мы не видим, что внутри. В OpenSCAD, можно для режима просмотра делать выбранные фигуры полупрозрачные, для этого надо в начале строки, перед командой добавить "%".
Вот код:
difference(){
union(){
cube([14,1,15], center=true);
rotate(a=90, v=[0,0,1]){
cube([14,1,15], center=true);
}
}
translate(v=[0,0,-15/2]){
cube(15, center=true);
}
}
%translate(v=[0,0,15/4]){
cylinder(h=15/2, r=7, r2=2, center=true);
}
И что получается:
Ок, теперь нам надо получить пересечение нашей крестовины и конуса.
Команда пересечения фигур: intersection() { OBJ1; OBJ2; ...}
Добавляем в наш код:
intersection(){
difference(){
union(){
cube([14,1,15], center=true);
rotate(a=90, v=[0,0,1]){
cube([14,1,15], center=true);
}
}
translate(v=[0,0,-15/2]){
cube(15, center=true);
}
}
translate(v=[0,0,15/4]){
cylinder(h=15/2, r=7, r2=2, center=true);
}
}
И получаем результат:
Стойка для крепления нити готова.
Дальше будет проще, рисуем ушко для нити.
Моделирование ушка для нити
Ушко — это будет маленькое колечко. Мы его создадим с помощью вычитания плоских цилиндров.
Для этого рисуем цилинд, высота которого будет равна толщине ушка, внутри него рисуем меньший цилиндр, и вычитаем из большего. Далее то что получилось поворачиваем на 90 градусов вокруг оси у, и поднимаем вверх на вершину нашей крестовины.
Вот этот фрагмент кода:
translate(v=[0,0,15/2]){
rotate(a=90, v=[1,0,0]){
difference(){
cylinder(h=1, r=2, center=true);
cylinder(h=1, r=1, center=true);
}
}
}
И результат
Вот это в коде нашей программы:
intersection(){
difference(){
union(){
cube([14,1,15], center=true);
rotate(a=90, v=[0,0,1]){
cube([14,1,15], center=true);
}
}
translate(v=[0,0,-15/2]){
cube(15, center=true);
}
}
translate(v=[0,0,15/4]){
cylinder(h=15/2, r=7, r2=2, center=true);
}
}
translate(v=[0,0,15/2]){
rotate(a=90, v=[1,0,0]){
difference(){
cylinder(h=1, r=2, center=true);
cylinder(h=1, r=1, center=true);
}
}
}
И вот результат:
То есть крепление для нити есть, теперь надо сделать основание для сд диска.
Основание для диска
Мы поступим хитро — мы не будем его рисовать. Мы воспользуемся Рафтом.
Что такое Рафт?
Рафт (raft) это техническая подложка, которую генерирует программа для 3д печати, это способ повышения прилипания печатаемой 3д фигурки.
Вот так выглядит Рафт, по сути это сеточка внизу:
Рафт автоматически вычисляется согласно контуру основания фигуры, и делается отступ вокруг, как правило 5мм.
Нам как раз это и надо — подложка, слой под нашей фигуркой обеспечит опору для CD-диска.
Кольцо в основании
Единственная тонкость — Рафт будет в форме крестовины, но это легко исправить — нарисуем тонкое кольцо внизу.
Рисуем два цилиндра, высотой 0.5 мм, внешний диаметром 14мм, то есть радиус 7 мм, внутренний радиусом 6.5 мм, и вычитаем — получим кольцо, поднимаем вверх на 0.25 (так как рисовали в центре координат).
Вот код фрагмента:
translate(v=[0,0,0.25]){
difference(){
cylinder(h=0.5, r=7, center=true);
cylinder(h=0.5, r=6.5, center=true);
}
}
Результат:
И вот финальный код для рисования:
intersection(){
difference(){
union(){
cube([14,1,15], center=true);
rotate(a=90, v=[0,0,1]){
cube([14,1,15], center=true);
}
}
translate(v=[0,0,-15/2]){
cube(15, center=true);
}
}
translate(v=[0,0,15/4]){
cylinder(h=15/2, r=7, r2=2, center=true);
}
}
translate(v=[0,0,15/2]){
rotate(a=90, v=[1,0,0]){
difference(){
cylinder(h=1, r=2, center=true);
cylinder(h=1, r=1, center=true);
}
}
}
translate(v=[0,0,0.25]){
difference(){
cylinder(h=0.5, r=7, center=true);
cylinder(h=0.5, r=6.5, center=true);
}
}
Системные переменные
Возможно отметили — что окружности получаются «угловатые», для увеличения количества сегментов для рисования окружностей, можно выставить параметр (в самом начале кода):
$fn=30;
Тогда получится более красиво:
Генерация СТЛ
Наконец то!
Теперь, не забываем нажать F6, для рендеринга. И в меню File -> Export -> Export as STL..., сохраняется STL файл.
Печать
Теперь загружаем полученный STL в программу 3д печати, не забываем выставить опцию Raft в настройках (5 мм).
Так это выглядит в программе Cura:
И стартуем на печать.
Результат
Вот деталька в действии:
А вот наш Рафт:
В качестве заключения
Это конечно самые базовые возможности OpenSCAD (не были рассмотрены возможности создания своих функций, использование переменных), но даже их достаточно, чтобы относительно быстро сделать 3д модель.
Если вы не знаете где выполнить 3д печать в вашем городе, то можно сделать:
- поиск по хакспейсам в вашем городе, как правило там есть 3д принтеры, и они доступны для небольших заказов
- можете поискать фаблаб, там 3д принтер так же должен быть
- поискать сервис 3д печати (в вашем городе)
Скачать модель
Модельку и код можно скачать с Thingiverse.
Автор: nemilya