Найти тему
Универ на диване

Моделируем в 3Д: OpenSCAD

Здравствуйте, Дорогие друзья! В данной статье мы с Вами будем строить 3Д модели. Начнем конечно же с примитивов, а закончим полноценной моделью. Надеюсь, что Вам будет не только интересно, но и полезно это читать. Для моделирования мы будем использовать программу с открытым исходным кодом OpenSCAD.

Рисунок 1 – Скриншот справки OpenSCAD

Конечно же наиболее популярны такие системы проектирования, как FreeCAD и подобные ему, но, как по мне, в OpenSCADработать намного удобнее, чем в них. Да и весит она на порядок (а то и на два) меньше указанных выше (не говоря уж о Компасе). Для данной программы существуют примеры, но они не отличаются, как бы правильнее выразиться, полнотой. Я же постараюсь сделать свои примеры, насколько это будет возможным, подробными. Чтобы человек, который хочет начать работать в OpenSCAD мог понять не «как сделать», а «почему» и «как МОЖНО сделать». Конкретно в этой статье ничего экстраординарного мы строить не будем. Только ознакомимся с некоторыми важными функциями OpenSCAD.

Давайте заглянем в справочник OpenSCAD:

Рисунок 2 – Справочник функций OpenSCAD
Рисунок 2 – Справочник функций OpenSCAD

На вид ничего сложного. По сути, так оно и есть. Примитивные 3Д-объекты можно получить двумя способами: непосредственным их построением, либо выдавливанием 2Д-фигур. Начнем с привычного многим способа с выдавливанием, то есть такого, который используется при моделировании в Компасе. Из справочника к программе мы видим, что на плоскости мы можем отобразить 8 базовых фигур:

1. circle() – круг. Именно круг, а не окружность. Давайте построим его в OpenSCAD. Сделать это очень просто: открываем программу и создаем новый файл:

Рисунок 3 – Стартовое окно OpenSCAD (жмём «Создать»)
Рисунок 3 – Стартовое окно OpenSCAD (жмём «Создать»)
Рисунок 4 – Интерфейс программы OpenSCAD
Рисунок 4 – Интерфейс программы OpenSCAD

Рабочее окно программы включает в себя три дочерних окна: Редактор (здесь вводим программный код), Консоль (здесь отображаются прогресс построения модели и предупреждения об ошибках, если такие возникают), 3Д-Модель (здесь отображается модель, которую мы проектируем).

Для построения круга в окне Редактор введем функцию circle(). В качестве параметров передаем в функцию радиус r. Пусть он будет равен 20 мм.

Рисунок 5 – Содержимое окна Редактор
Рисунок 5 – Содержимое окна Редактор
Рисунок 6 – Вид окна 3Д модель
Рисунок 6 – Вид окна 3Д модель

По умолчанию даже 2Д объекты здесь имеют толщину (иначе их будет проблематично отобразить). По факту же никакой толщины не подразумевается. Итак, что мы можем сделать с построенным кругом? Фигура состоит из большого количества «кусочков» - элементарных фрагментов. Количество это мы можем задать самостоятельно. Для этого существует специальная переменная $fn(значок доллара указывает на то, что она специальная). Например, хотите получить из круга треугольник, вписанный в окружность заданного радиуса? Пожалуйста: вводим в редактор функцию circle, указываем радиус и чему равна специальная переменная (для треугольника, естественно, она равна 3):

Рисунок 7 – Содержимое окна Редактор
Рисунок 7 – Содержимое окна Редактор
Рисунок 8 – Вид окна 3Д модель
Рисунок 8 – Вид окна 3Д модель

Но, всё же, чтобы не путать 3Д и 2Д, давайте «поместим под нормаль» плоскость ХУ (то есть будем видеть только то, что находится в одной плоскости). На панели инструментов жмём соответствующую виртуальную кнопку:

Рисунок 9 – Устанавливаем вид сверху
Рисунок 9 – Устанавливаем вид сверху

Теперь мы видим только то, что проецируется на плоскость ХУ:

Рисунок 10 – Вид окна 3Д модель
Рисунок 10 – Вид окна 3Д модель

Нужно построить квадрат? Пятиугольник? Шестиугольник? Стоугольник? Не проблема: приравниваем переменную $fn к требуемому числу.

Рисунок 11 – Варьируем значение переменной $fn
Рисунок 11 – Варьируем значение переменной $fn

Про стоугольник я заговорил не случайно. Это по сути аппроксимированная окружность. Чем большее количество элементов мы зададим при построении фигуры, тем она точнее будет построена. Я, обычно, при построении окружностей (кругов!) задаю $fn=200. Чтобы было удобнее говорить о подобных параметрах, давайте введем собственный термин. Пусть это будет «точность воспроизведения фигуры или тела относительно их специфики», ну или просто «точность воспроизведения». Проще говоря введенная нами величина будет показывать насколько построенный круг похож на круг всамделишный, квадрат на квадрат, а сфера на сферу. Величина эта не будет абсолютной, а скорее относительной.

Так вот, точность воспроизведения можно задать не только напрямую количеством элементов, из которых состоит фигура, но и указывая параметры этих элементов. Например, мы можем задавать угол на который мы делим 360 градусов и получаем количество элементов (или угол, принадлежащий вершине элемента). За подобный способ отвечает специальная переменная $fa. Построим те же фигуры, что и ранее, но указывая при этом не параметр $fn, а параметр $fa. Для Пятиугольника $fa=360/5=72. Можно, кстати прямо дробью и задавать значение.

Рисунок 12 – Варьируем значение переменной $fa
Рисунок 12 – Варьируем значение переменной $fa

Почему я начал с пятиугольника, а не с треугольника, как в прошлый раз? При использовании переменной $faее наибольшим значением является 360/5, то есть 72 градуса. И даже если Вы укажете $fa=360/3 или $fa=360/4, программа всё равно построит пятиугольник.

Следующий способ, с помощью которого можно оперировать точностью воспроизведения – задать длину основания элемента (треугольника, при вращении которого и получается фигура). За данный параметр отвечает переменная $fs. Чтобы было понятней покажу на примере круга, аппроксимированного до шестиугольника:

Рисунок 13 – Отображение переменных fa, fn и fs
Рисунок 13 – Отображение переменных fa, fn и fs

Для примера построим круг с fs=10:

Рисунок 14 – Содержимое окна Редактор
Рисунок 14 – Содержимое окна Редактор
Рисунок 15 – Вид окна 3Д модель
Рисунок 15 – Вид окна 3Д модель

Так, уменьшая значение переменной fs, мы увеличиваем точность воспроизведения.

Задавать размер круга можно не только через радиус, но и через диаметр. Для этого указываем не «r», а «d».

С circle разобрались, переходим ко второй базовой 2Д фигуре – к прямоугольнику. Для построения прямоугольника используется команда square(). В качестве параметров в функцию передаются размеры сторон и расположение фигуры относительно начала координат. Если нам нужно построить квадрат, то достаточно указать только одно значение (длина стороны, так как все стороны у квадрата одинаковые).

Рисунок 16 – Содержимое окна Редактор
Рисунок 16 – Содержимое окна Редактор
Рисунок 17 – Вид окна 3Д модель
Рисунок 17 – Вид окна 3Д модель

Насколько можно судить, построение фигуры выполнено по умолчанию от начала координат. Если нужно, чтобы центр фигуры был расположен в начале координат, то достаточно установить позиционирование в центр:

Рисунок 18 – Содержимое окна Редактор
Рисунок 18 – Содержимое окна Редактор
Рисунок 19 – Вид окна 3Д модель
Рисунок 19 – Вид окна 3Д модель

Давайте теперь построим прямоугольник. Для этого вместо длины стороны квадрата в квадратных скобках указываем через запятую длину по иксу и по игреку:

Рисунок 20 – Содержимое окна Редактор
Рисунок 20 – Содержимое окна Редактор
Рисунок 21 – Вид окна 3Д модель
Рисунок 21 – Вид окна 3Д модель

Также, следует заметить, что кодовое слово center можно не писать – синтаксис OpenSCADэто позволяет.

Переходим к третьей примитивной фигуре – к многоугольнику. В отличие от рассмотренных ранее фигур, многоугольник предполагает наличие точных координат своих вершин, которые ему задает пользователь. Построить многоугольник можно вызвав функцию polygon(). В самом простом случае достаточно указать координаты точек в таком порядке, в котором точки будут соединяться линиями. Координаты записываются в квадратных скобках:

Рисунок 22 – Содержимое окна Редактор
Рисунок 22 – Содержимое окна Редактор
Рисунок 23 – Вид окна 3Д модель
Рисунок 23 – Вид окна 3Д модель

Есть также возможность строить фигуру, располагая указанные точки в другом порядке. Для этого на позиции, следующей за позицией координат точек, в функции указывается порядок следования точек (тоже в квадратных скобках). Нумерация точек начинается с нуля (так как они образуют массив). Например:

Рисунок 24 – Содержимое окна Редактор
Рисунок 24 – Содержимое окна Редактор
Рисунок 25 – Вид окна 3Д модель
Рисунок 25 – Вид окна 3Д модель

Порядок точек не случайно указывается в двойных квадратных скобках. Указав точки единожды можно использовать их для построения нескольких фигур:

Рисунок 26 – Содержимое окна Редактор
Рисунок 26 – Содержимое окна Редактор
Рисунок 27 – Вид окна 3Д модель
Рисунок 27 – Вид окна 3Д модель

Если объекты будут перекрывать друг друга, то второй вычтется из первого:

Рисунок 28 – Содержимое окна Редактор
Рисунок 28 – Содержимое окна Редактор
Рисунок 29 – Вид окна 3Д модель
Рисунок 29 – Вид окна 3Д модель

Функцией polygon() я почти никогда не пользуюсь, потому как это не очень удобно.

Рассмотрим еще одну функцию, без применения которой мы не сможем построить полноценную модель. Это функция text(). В качестве параметров в данную функцию задаются:

- строка (текст в кавычках):

Рисунок 30 – Содержимое окна Редактор
Рисунок 30 – Содержимое окна Редактор
Рисунок 31 – Вид окна 3Д модель
Рисунок 31 – Вид окна 3Д модель

- size – размер, указывается в миллиметрах. Чтобы указать его в pt(вдруг кому понадобится), необходимо домножить требуемый размер в pt на 0,12.

Рисунок 32 – Содержимое окна Редактор
Рисунок 32 – Содержимое окна Редактор
Рисунок 33 – Вид окна 3Д модель
Рисунок 33 – Вид окна 3Д модель

- font – шрифт (указывается в кавычках):

Рисунок 34 – Содержимое окна Редактор
Рисунок 34 – Содержимое окна Редактор
Рисунок 35 – Вид окна 3Д модель
Рисунок 35 – Вид окна 3Д модель

- haling – выравнивание по горизонтали. Принимает значения «left», «center» и «right». По умолчанию установлено значение «left», если его изменить на «right», текст сместится в левую область от точки позиционирования:

Рисунок 36 – Содержимое окна Редактор
Рисунок 36 – Содержимое окна Редактор
Рисунок 37 – Вид окна 3Д модель
Рисунок 37 – Вид окна 3Д модель

Если установить значение «center», то середина текста сместится в точку позиционирования.

- valign – выравнивание текста по вертикали. Может принимать одно значение из четырех возможных: «top», «bottom», «baseline» и «center». По умолчанию установлено значение «baseline». Если указать значение «top», то текст будет расположен под точкой позиционирования, если указать «bottom», то текст будет расположен над точкой позиционирования, если «center», то середина текста по вертикали будет совпадать с точкой позиционирования.

- spacing – интервал между символами. По умолчанию принят за единицу. Рассмотрим, что будет, если мы уменьшим интервал до 0.75:

Рисунок 38 – Содержимое окна Редактор
Рисунок 38 – Содержимое окна Редактор
Рисунок 39 – Вид окна 3Д модель
Рисунок 39 – Вид окна 3Д модель

Теперь увеличим расстояние в два раза:

Рисунок 40 – Содержимое окна Редактор
Рисунок 40 – Содержимое окна Редактор
Рисунок 41 – Вид окна 3Д модель
Рисунок 41 – Вид окна 3Д модель

- direction – направление текста. Может принимать значения «ltr»(слева-направо), «rtl»(справа-налево), «ttb» (сверху-вниз) и «btt» (снизу-вверх).

Рисунок 42 – Расположение текста в зависимости от значения параметра direction
Рисунок 42 – Расположение текста в зависимости от значения параметра direction

- language – язык. Здесь всё просто: указывается сокращенное значение. Например «en», «ru» и прочие. По умолчанию установлено значение «en».

- script – шрифт (на этот раз группа шрифтов). По умолчанию здесь стоит латиница. Никогда данный параметр не изменял, всё и так хорошо работает.

Теперь поговорим о том, как сделать текст полужирным или наклонным. Для этого нужно внести изменения в параметр font. Делается это следующим образом:

Рисунок 43 – Содержимое окна Редактор
Рисунок 43 – Содержимое окна Редактор
Рисунок 44 – Вид окна 3Д модель
Рисунок 44 – Вид окна 3Д модель
Рисунок 45 – Содержимое окна Редактор
Рисунок 45 – Содержимое окна Редактор
Рисунок 46 – Вид окна 3Д модель
Рисунок 46 – Вид окна 3Д модель
Рисунок 47 – Содержимое окна Редактор
Рисунок 47 – Содержимое окна Редактор
Рисунок 48 – Вид окна 3Д модель
Рисунок 48 – Вид окна 3Д модель

Шрифт (font) можно подключить любой. Главное, чтобы он был заранее установлен в папке C:\Windows\Fonts.

С текстом вроде разобрались. Идем дальше. На очереди функция import(). С помощью данной функции можно извлечь данные из любого файла форматов .dxf и .svg(для 2Д) для последующей с ними работы. У нас уже есть документы в .svg. Мы делали их в Inkscape, когда разрабатывали шаблоны рамок для чертежей. Так как в файле сохранена страница с рамкой, то не поверите, что мы получим в OpenSCAD: страницу!

Рисунок 49 – Содержимое окна Редактор
Рисунок 49 – Содержимое окна Редактор
Рисунок 50 – Вид окна 3Д модель
Рисунок 50 – Вид окна 3Д модель

Так как сам лист считается твердым телом, то он у нас и отобразился.

Импортировать 2Д объекты нужно не так уж часто, да и OpenSCAD делает экспорт обратно в их формат, скажем так «немного по-своему»: иногда толстые линии отображаются в виде двух параллельных линий без заполнения между ними. Поэтому на импорте именно 2Д объектов мы останавливаться не будем.

Для того, чтобы из 2Д-объекта получить 3Д-объект можно применить одну из двух функций: linear_extrude() или rotate_extrude(). Для примера построим примитив в виде квадрата.

Рисунок 51 – Строим 2Д примитив
Рисунок 51 – Строим 2Д примитив

Применим к объекту выдавливание по вертикали. Для этого функцию linear_extrude() нужно разместить перед описанием объекта и передать в нее параметр height. Установим значение этого параметра, скажем 5 мм.

Рисунок 52 – Передаем в функцию linear_extrude() параметр height
Рисунок 52 – Передаем в функцию linear_extrude() параметр height

Отлично: теперь это уже не плоская фигура, а объемное тело.

Следующим параметром, который мы с Вами рассмотрим, является twist. Значение для данного параметра задается в градусах и показывает насколько сильно объект при выдавливании будет закручен. Не понимаете смысла сказанного? Смотрите: зададим height=80, а twist=90.

Рисунок 53 – Наглядная демонстрация работы параметра twist
Рисунок 53 – Наглядная демонстрация работы параметра twist

Как видите, примитив за время своего движения был повернут на 90 градусов вокруг оси z. Не спорю, ребристая поверхность выглядит красиво, но если нам нужна не красота, а точность? Для того, чтобы сгладить поверхность объекта есть параметр slices. Его значение равно количеству плоскостей вдоль оси z, которые проходит примитив при выдавливании. Для примера зададим slices=400:

Рисунок 54 – Применяем параметр slices
Рисунок 54 – Применяем параметр slices

Следующий параметр, который мы с Вами рассмотрим – это scale. Данный параметр позволяет сжимать или растягивать наш объект вдоль одной из осей. Для примера превратим круг в овал:

Рисунок 55 – Применяем параметр scale
Рисунок 55 – Применяем параметр scale

Перед тем как рассмотреть функцию rotate_extrude, нам необходимо ознакомиться с функцией, которая помогает задать точку позиционирования. Данная функция носит название translate() и ее мы будем использовать при работе в OpenSCAD чаще всех других. Итак, в качестве параметра в эту функцию будет передаваться точка, то есть ее координаты. Синтаксис у функции простой:

translate([координата х, координата у, координата z])

Также следует рассмотреть функцию, позволяющую поворачивать объект вокруг указанной оси на указанное количество градусов. Эта функция носит название rotate(). В качестве параметров в нее передаются углы поворота вокруг осей в градусах.

Рассмотрим теперь в работе все три функции (translate(), rotate() и rotate_extrude()). Для примера построим примитив в виде круга и сместим его из нуля, скажем в точку с координатами [40,40,0]:

Рисунок 56 – Применяем функции translate() и rotate_extrude()
Рисунок 56 – Применяем функции translate() и rotate_extrude()

Теперь повернем получившуюся модель на 90 градусов вокруг оси х:

Рисунок 57 – Применяем функцию rotate()
Рисунок 57 – Применяем функцию rotate()

Обратите внимание, чем ближе функция расположена в коде к функции, создающей объект, тем раньше она будет выполнена. То есть, сначала мы строим примитив в виде круга, затем смещаем его в точку с координатами [40,40,0], потом выдавливаем вращением, а уже потом поворачиваем вокруг икса на 90 градусов.

Теперь рассмотрим 3Д-примитивы. Их всего три: куб, цилиндр и сфера. Итак, куб: под этим понятием в OpenSCADсобраны все твердотельные параллелепипеды. Функция для построения куба так и называется cube(). В качестве параметров в нее передается размер стороны или размеры сторон, если строим неравносторонний параллелепипед, а также расположение тела относительно точки позиционирования. Если размер не один, то его принято указывать в квадратных скобках:

Рисунок 58 – Содержимое окна Редактор
Рисунок 58 – Содержимое окна Редактор
Рисунок 59 – Вид окна 3Д модель
Рисунок 59 – Вид окна 3Д модель

Видите, что параметр center принимает значение «true»? В этом случае центр модели помещается в точку позиционирования. Изменим это значение на «false».

Рисунок 60 – Содержимое окна Редактор
Рисунок 60 – Содержимое окна Редактор
Рисунок 61 – Вид окна 3Д модель
Рисунок 61 – Вид окна 3Д модель

Нижний левый угол модели сместился в начало координат. Теперь давайте построим простой кубик со стороной 20 мм:

Рисунок 62 – Содержимое окна Редактор
Рисунок 62 – Содержимое окна Редактор
Рисунок 63 – Вид окна 3Д модель
Рисунок 63 – Вид окна 3Д модель

И ничего сложного. Переходим к следующему примитиву: к цилиндру. Сразу оговорюсь, что дальше я буду использовать для установки параметров гладкости модели только параметр $fn, так как считаю его наиболее удобным для этого. Итак, для того чтобы построить цилиндр используется функция cylinder(). В нее передаются такие параметры как высота модели (h), радиус окружности, лежащей в основании тела (r) или же ее диаметр (d), также указывается положение объекта относительно точки позиционирования (center, по умолчанию этот параметр «false») и параметры поверхности (та самая специальная переменная $fn). Давайте построим цилиндр высотой 20 мм и радиусом 8 мм. Прочие параметры указывать не будем. И вот что мы получим:

Рисунок 64 – Содержимое окна Редактор
Рисунок 64 – Содержимое окна Редактор
Рисунок 65 – Вид окна 3Д модель
Рисунок 65 – Вид окна 3Д модель

Как видите, объект получился сильно «аппроксимированным». Произошло это потому, что мы не указывали параметров fa, fs или fn. Укажем $fn=150 и посмотрим что будет:

Рисунок 66 – Содержимое окна Редактор
Рисунок 66 – Содержимое окна Редактор
Рисунок 67 – Вид окна 3Д модель
Рисунок 67 – Вид окна 3Д модель

Теперь поверхность модели стала более гладкой. Я бы выразился даже «более точной». Теперь сместим центр цилиндра в точку позиционирования. Для этого присвоим параметру center значение «true». Центр основания цилиндра сместится в точку позиционирования по оси Z.

Рисунок 68 – Содержимое окна Редактор
Рисунок 68 – Содержимое окна Редактор
Рисунок 69 – Вид окна 3Д модель
Рисунок 69 – Вид окна 3Д модель

И опять ничего сложного! Идем дальше. Функция cylinder() позволяет нам строить не только цилиндры, но и конусы, а также усеченные конусы. Для этого в функцию передаются не один радиус или диаметр объекта, а два, например радиус нижнего основания (r1) и верхнего (r2). Построим для примера усеченный конус высотой 15 мм, с радиусом нижнего основания 6 мм, верхнего – 2 мм. Значение параметра fnзададим равным 100, позиционирование – по умолчанию.

Рисунок 70 – Содержимое окна Редактор
Рисунок 70 – Содержимое окна Редактор
Рисунок 71 – Вид окна 3Д модель
Рисунок 71 – Вид окна 3Д модель

Думаю, Вы понимаете, что если присвоить значение 2 мм r1 и значение 6мм r2, то конус будет просто отражен по вертикали. Если нам понадобится построить обычный, не усеченный, конус, то в качестве параметра верхнего основания следует указать ноль. С цилиндром вроде разобрались. Но! Есть небольшое замечание. Следует знать, что с помощью переменной fn мы можем получить цилиндр с горизонтальным сечением в виде треугольника, квадрата, пятиугольника и т.д. Также важно учитывать размеры объекта, ведь чем они больше, тем больше должно быть значение fnчтобы цилиндр выглядел менее «ломаным».

Переходим к сфере. Сферу можно построить с помощью функции sphere(). В качестве параметров в нее передается радиус (r) или диаметр (d), а также параметр $fn. В качестве примера построим сферу с радиусом 20 мм. Количество элементов поверхности (fn) указывать не будем:

Рисунок 72 – Содержимое окна Редактор
Рисунок 72 – Содержимое окна Редактор
Рисунок 73 – Вид окна 3Д модель
Рисунок 73 – Вид окна 3Д модель

Вот так будет выглядеть сфера по умолчанию. Теперь давайте зададим fn равным, скажем, 100:

Рисунок 74 – Содержимое окна Редактор
Рисунок 74 – Содержимое окна Редактор
Рисунок 75 – Вид окна 3Д модель
Рисунок 75 – Вид окна 3Д модель

Вот об этом я как раз и говорил: размеры объекта слишком велики, поэтому нужно увеличить значение fn еще больше. Примем его равным 200:

Рисунок 76 – Содержимое окна Редактор
Рисунок 76 – Содержимое окна Редактор
Рисунок 77 – Вид окна 3Д модель
Рисунок 77 – Вид окна 3Д модель

Ну вот, так-то лучше!

Существует также дополнительный 3Д-объект. Примитивом его называть не хочется, данный объект – многогранник. Строится он с помощью функции polyhedron(). Изначально я не хотел делать описание и приводить примеры для многогранника, потому что сам ее никогда не использую, но подумав, вдруг Вам она понадобится, всё же решил про нее написать. В polyhedron() передаются координаты точек, точно также как и в polygon(), только здесь есть еще и z-координата. Также здесь обязательно нужно задавать порядок следования точек, разбивая объект на грани. Построим простой объект, скажем семигранник, для этого достаточно придумать пять точек и дублировать их (откопипастить), сместив по координате z. Затем указываем то, как точки располагаются в пространственных плоскостях, то есть на видах объекта. Делается это следующим образом:

polyhedron([[координаты точки 0],

[координаты точки 1],

[координаты точки 2],

[координаты точки 3],

[координаты точки 4],

[координаты точки 5],

[координаты точки 6],

[координаты точки 7],

[координаты точки 8],

[координаты точки 9]],

[[точки грани 1], [точки грани 2],

[точки грани 3], [точки грани 4],

[точки грани 5], [точки грани 6],

[точки грани 7]]);

Рисунок 78 – Процесс построения семигранника с использованием функции polyhedron()
Рисунок 78 – Процесс построения семигранника с использованием функции polyhedron()

Как по мне, такой способ не очень действенный.

В принципе, с примитивами на этом можно закончить. Переходим к более интересному занятию. Сделаем простой объект: болт. Для начала сделаем заготовку болта. Пусть резьба у нас будет М8 с шагом 1.25 мм. Разработку модели начнем с того, что найдём диаметральный размер головки для стандартного болта с указанными параметрами. Идём в ГОСТ 7798-70 и смотрим диаметр описанной окружности и размер под ключ. Диаметр описанной окружности 14.2 мм. Также нам нужна высота головки (5.3 мм) и длина резьбы (ее примем равной 25 мм). Никаких дополнительных элементов учитывать не будем, потому что на самом деле этим примером я хочу показать как можно быстро и красиво «нарезать» резьбу в OpenSCAD. Сначала построим основу. Это будет шестигранник и цилиндр:

Рисунок 79 – Создаем основу болта
Рисунок 79 – Создаем основу болта

Стержень я построил произвольного диаметра, потому как сейчас мы посмотрим в ГОСТ и узнаем каким он должен быть. Стандарт, к которому мы должны обратиться – ГОСТ 24705-2004. И из него нам нужно вот это изображение с описанием к нему:

Рисунок 80 – Номинальные размеры резьбы: 1 – внутренняя, 2- внешняя. Источник: ГОСТ 24705-2004, URL: https://docs.yandex.ru/docs/view?tm=1707387961&tld=ru&lang=ru&name=gost-24705-2004.pdf&text=ГОСТ%2024705-2004&url=https%3A%2F%2Fntcexpert.ru%2Fdocuments%2Fdocs%2Fnormativs%2Fgost-24705-2004.pdf&lr=66&mime=pdf&l10n=ru&sign=36789393ec5a99eb85794b095815f566&keyno=0&nosw=1&serpParams=tm%3D1707387961%26tld%3Dru%26lang%3Dru%26name%3Dgost-24705-2004.pdf%26text%3D%25D0%2593%25D0%259E%25D0%25A1%25D0%25A2%2B24705-2004%26url%3Dhttps%253A%2F%2Fntcexpert.ru%2Fdocuments%2Fdocs%2Fnormativs%2Fgost-24705-2004.pdf%26lr%3D66%26mime%3Dpdf%26l10n%3Dru%26sign%3D36789393ec5a99eb85794b095815f566%26keyno%3D0%26nosw%3D1 (Дата обращения:08.02.2024)
Рисунок 80 – Номинальные размеры резьбы: 1 – внутренняя, 2- внешняя. Источник: ГОСТ 24705-2004, URL: https://docs.yandex.ru/docs/view?tm=1707387961&tld=ru&lang=ru&name=gost-24705-2004.pdf&text=ГОСТ%2024705-2004&url=https%3A%2F%2Fntcexpert.ru%2Fdocuments%2Fdocs%2Fnormativs%2Fgost-24705-2004.pdf&lr=66&mime=pdf&l10n=ru&sign=36789393ec5a99eb85794b095815f566&keyno=0&nosw=1&serpParams=tm%3D1707387961%26tld%3Dru%26lang%3Dru%26name%3Dgost-24705-2004.pdf%26text%3D%25D0%2593%25D0%259E%25D0%25A1%25D0%25A2%2B24705-2004%26url%3Dhttps%253A%2F%2Fntcexpert.ru%2Fdocuments%2Fdocs%2Fnormativs%2Fgost-24705-2004.pdf%26lr%3D66%26mime%3Dpdf%26l10n%3Dru%26sign%3D36789393ec5a99eb85794b095815f566%26keyno%3D0%26nosw%3D1 (Дата обращения:08.02.2024)

Итак, что мы тут видим: P - шаг резьбы, H – высота исходного треугольника резьбы, D – номинальный диаметр резьбы, D1 и d1 – это номинальные внутренние диаметры внутренней и внешней резьбы соответственно. Вычислить эти значения можно по формулам из того же ГОСТа:

-81

Или просто посмотреть в стандарте всё что нужно. Для того, чтобы построить резьбу, нам также понадобится значение H:

-82

Резьбу будем строить с помощью конуса. Высоту конуса мы знаем (Н), диаметр нижнего основания тоже (Р). Остается найти радиус верхнего основания (r2). Это легко, так как мы из рисунка 80 знаем, чему равно расстояние от d3 до D:

-83

Радиус найдем с помощью подобных треугольников, то есть для начала определим во сколько раз высота конуса больше высоты его вершины, которую мы должны срезать:

Рисунок 81 – Пояснение
Рисунок 81 – Пояснение
-85

Отлично. У нас есть все необходимые значения для того, чтобы построить резьбу. Для начала строим конус и располагаем его основание на расстоянии D/2 – (17/24)H – h = 4-0.7667-0.158=3,0753 мм от нуля, скажем по иксу. Покажу в отдельном файле для наглядности, затем соединю с заготовкой.

Рисунок 82 – Строим усеченный конус
Рисунок 82 – Строим усеченный конус

Теперь поворачиваем конус на 90 градусов вокруг оси игреков.

Рисунок 83 – Поворачиваем конус вокруг оси у на 90 градусов
Рисунок 83 – Поворачиваем конус вокруг оси у на 90 градусов

Резьба формируется циклически. Пусть у нас на один виток будет приходиться 300 конусов. От количества объектов на виток зависит качество резьбы. Применим функции rotate() и translate(). Первой мы будем сдвигать образ конуса вокруг оси z, а с помощью второй постепенно поднимать его вверх. Сделаем пробный виток:

Рисунок 84 – Смещаем образ по иксу на расстояние H-h от точки 0
Рисунок 84 – Смещаем образ по иксу на расстояние H-h от точки 0
Рисунок 85 – Строим один виток резьбы
Рисунок 85 – Строим один виток резьбы

На каждой итерации цикла мы увеличиваем угол поворота на 360/300=1.2 градуса, при этом смещаем образ на приблизительно 4.2 микрона. Хотите сделать нашу резьбу более «презентабельной»? Увеличим число итераций в 5 раз:

Рисунок 86 – Делаем поверхность более гладкой
Рисунок 86 – Делаем поверхность более гладкой

Однако, на мой взгляд, достаточно будет и 600 объектов на один виток. Для того, чтобы построить нужное нам количество витков мы можем выполнить одно из двух действий: в текущем цикле увеличить количество оборотов образа вокруг оси (то есть сделать угол поворота не 360 градусов, а 360*количество витков), при этом увеличить и расстояние, чтобы его хватало для подъема образа на эти несколько оборотов. Либо, что более просто: поместить текущий цикл в другой цикл, с помощью которого мы сможем задавать номер строящегося витка.

Рисунок 87 – Строим 10 витков с помощью вложенного цикла
Рисунок 87 – Строим 10 витков с помощью вложенного цикла

Поясню код: вложенный цикл for(i=[0:1:600]){} – с помощью данного цикла мы строим один виток резьбы. В круглых скобках указано как будет изменяться переменная i, то есть как в любом языке программирования, указываем начальное значение, шаг, конечное значение. Рассмотрим тело этого цикла, идём снизу вверх, то есть начинаем с построения базового объекта. Cylinder(h=0.9244, r1=0.625, r2=0.091, $fn=15) – строим усеченный цилиндр с высотой 0.9244 мм, радиусом нижнего основания 0.625 мм, радиусом верхнего основания 0.091 мм и количеством элементов поверхности 15 (рисунок77). С помощью функций rotate([0,90,0]) и translate([3.5378,0,0]) поворачиваем конус вокруг оси у и смещаем его вдоль оси х на 3.5378 мм. Затем полученный объект строится снова и снова, поворачиваясь на угол 360/600 от предыдущего каждую итерацию (функция rotate([0,0,i*360/1500])). Одновременно с поворотом выполняется смещение по вертикали на (1.25/600) мм с помощью функции translate([0,0,1.25*k+i*1.25/600]).

Данный цикл помещен в другой, в котором с каждой итерацией увеличивается значение k. То есть на первой итерации строиться первый виток резьбы (k=0), на второй – второй виток (k=1) и т.д. Каждый новый виток начинает строиться на 1.25 мм выше предыдущего, то есть из той точки, в которой закончилось построение предыдущего.

Найдем количество витков, которое нам нужно. Для этого разделим длину резьбы на шаг резьбы:

25/1.25=20

Так как начинаем строить с нуля, то цикл должен завершиться на двадцатой итерации, то есть в тот момент, когда значение kстанет равным 19.

Переносим заготовку резьбы в файл основы болта (обратите внимание на то, что мы снова изменяем значение параметра zв функции translate(), прибавляя к нему высоту головки; к тому же я сделал дополнительное смещение 0.1 мм):

Рисунок 88 – Строим 20 витков на ножке основы
Рисунок 88 – Строим 20 витков на ножке основы

Теперь правим диаметр цилиндра основы. Его истинное значение – это d1:

Рисунок 89 – Редактируем толщину ножки и добавляем комментарии
Рисунок 89 – Редактируем толщину ножки и добавляем комментарии

Сделаем некоторые улучшения модели, а заодно познакомимся с еще одной функцией. Скруглим ребра на головке. Да-да: скруглять OpenSCADтоже умеет. Делается скругление с помощью функции minkowsky(){}. Я специально поставил после нее фигурные скобки, чтобы Вы про них не забывали. Параметрами для данной функции являются два тела. Первое – скругляемое, второе – движущееся по траектории ребер первого и скругляющее его. Применим функцию, потом объясню некоторые ее особенности:

Рисунок 90 – Применяем функцию minkowsky()
Рисунок 90 – Применяем функцию minkowsky()

Если Вы еще не заметили, то скругляющий объект – сфера с радиусом 0.3 мм. Функция minkowsky() в прямом смысле слова строит копии указанного скругляющего объекта, смещая их на очень маленькое расстояние друг от друга, используя при этом в качестве траекторий ребра скругляемого объекта. То есть Изначальный объект (скругляемый) увеличивается в размерах на два радиуса скругляющего. Поэтому я уменьшил размеры шестигранника на 0.6 мм по горизонтали и вертикали, а также сместил его вверх на 0.3 мм. Сложно для восприятия? Это да. Постараюсь пояснить проще: у нас есть некоторый каркас, сплетенный из проволоки:

Рисунок 91 – Каркас
Рисунок 91 – Каркас

Теперь наденем на этот каркас круглые бусины:

Рисунок 92 – Надеваем на каркас бусины
Рисунок 92 – Надеваем на каркас бусины

Так мы и выполняем скругление. Думаю, теперь воспринимать то, что я говорил раньше о функции minkowsky() стало проще.

Вернемся к построению нашего болтика. Добавим модели немного реалистичности: сместим резьбу на 1 шаг вверх (на 1.25 мм) и уберем из цикла один виток.

Рисунок 93 – Вносим изменения в модель
Рисунок 93 – Вносим изменения в модель

Почему бы нам не выровнять резьбу на торце ножки? Сделаем это. Просто подрежем торчащий за ее пределы виток. Для этого применим функцию вычитания одного объекта из другого. Называется эта функция difference(){}. Первый ее параметр – тело, из которого мы будем вырезать, второй и последующие – тело, которыми мы будем вырезать. Вырезать мы будем из резьбы. А срежем мы макушку обычным цилиндром с диаметром 9 мм. Но, для того, чтобы у нас всё получилось, необходимо, чтобы OpenSCADвоспринимал нашу резьбу не как большое количество конусов, а как один объект. Для этого объединим все объекты резьбы в один, используя функцию union(){}. Параметрами в ней являются объединяемые тела.

Рисунок 94 – Объединяем объекты резьбы в один
Рисунок 94 – Объединяем объекты резьбы в один

Визуально мы этого объединения не увидим. Теперь можно и убрать лишний кусочек резьбы, торчащий за пределы ножки:

Рисунок 95 – Срезаем лишнюю часть резьбы
Рисунок 95 – Срезаем лишнюю часть резьбы

Те зеленые вкрапления, которые появились на месте среза – всего-навсего след от цилиндра, которым мы «резали» заготовку. У разных объектов в OpenSCAD разные цвета. Поэтому на ножке и остался этот след. С цветом модели мы также разберемся, но немного позже. Сейчас сделаем ножку немного длиннее и снимем с нее фаску. Ничего в прямом смысле удлинять и подрезать мы не будем. Поступим проще: построим на ножке основы усеченный конус с диаметром нижнего основания равным диаметру ножки, а диаметр верхнего основания уменьшим на высоту этого конуса. Таким образом мы получим фаску 60 градусов (так как косинус 60 градусов равен 0.5). Если хотите 45, то придется уменьшать второй диаметр на значение высоты конуса, умноженное на два. Пусть высота конуса будет равна половине шага резьбы. Тогда в результате мы получим:

Рисунок 96 – Делаем фаску на ножке
Рисунок 96 – Делаем фаску на ножке

Построим еще один цилиндр от головки болта до резьбы. Его высота должна быть равна сумме одного шага, на который мы сдвинули резьбу вверх ранее и диаметру верхнего основания конуса, который мы использовали для построения резьбы.

Рисунок 97 – Притапливаем резьбу в ножке
Рисунок 97 – Притапливаем резьбу в ножке

Вот болтик и готов. Хотите чтобы он выглядел реалистичнее? Что ж, в этом нет ничего сложного. Определим что в нашей модели нас не устраивает. Первым делом смотрим на головку:

Рисунок 98 – Первый изъян нашей модели
Рисунок 98 – Первый изъян нашей модели

Разве она не должна немного скругляться? Смотрим в ГОСТ:

Рисунок 99 – Исполнения болтов по ГОСТ 7798-70
Рисунок 99 – Исполнения болтов по ГОСТ 7798-70

Мы видим, что нам необходимо снять фаску под углом от 15 до 30 градусов, при этом основание приобретет форму окружности с диаметром 0.95*S. S в нашем случае равна 13 мм (под ключ). То есть D= 0.95*13=12.35 мм. Сделаем фаску под углом 30 градусов. Казалось бы, нет ничего проще. Но! Обратите внимание на рисунок еще раз: нам нужно «подточить» не всю верхнюю грань, а только те места, где находятся вертикальные ребра шестигранника.

«Обточить» деталь мы можем по-разному. Например построить в 2Д треугольник и сделать выдавливание по кругу. Либо можем создать очень тонкую полоску в 3Д виде и циклически срезать лишний материал слой за слоем. Сделаем иначе: построим в 3Д виде плоскую полоску в форме прямоугольника и расположим ее под углом 30 градусов к модели. Полосу сделаем в виде квадрата и центрируем ее относительно точки позиционирования. Сторона квадрата должна быть равна 2*(14.2-12.35)/2=1.85мм (потому как синус 30 градусов равен 0.5). Остается решить вопрос как нам позиционировать квадрат. Нам нужно сделать следующее:

Рисунок 100 – Расположение квадрата в пространстве
Рисунок 100 – Расположение квадрата в пространстве

dz и dy – величины в мм, на которые нам нужно сдвинуть ЦЕНТР квадрата после поворота его на 30 градусов. Не буду грузить Вас математикой (синусами и косинусами), а просто покажу на какие значения нужно сделать сдвиг:

Рисунок 101 – Устанавливаем точку позиционирования для режущего объекта
Рисунок 101 – Устанавливаем точку позиционирования для режущего объекта

Применим функцию rotate() и функцию difference(). Создаем цикл под функцией minkowsky().

Рисунок 102 – «Обтачиваем» деталь
Рисунок 102 – «Обтачиваем» деталь

Получилось неплохо. Теперь добавим символьные обозначения того, что резьба метрическая и диаметр 8 мм. Для этого используем функцию text(). Выдавливание выполняем с помощью функции linear_extrude, а буквы позиционируем так, чтобы их высота составляла 0.3 мм:

Рисунок 103 – Нанесение символьных обозначений
Рисунок 103 – Нанесение символьных обозначений

Остался последний штрих: цвет детали. Для того, чтобы задавать цвета объектов в OpenSCAD есть функция color(). Параметр цвета задается в функцию разными способами. Мне больше нравится система rgb. Перекрасим нашу деталь в серый цвет. Для этого, содержимое редактора помещаем в фигурные скобки и в самое начало документа помещаем строчку:

color([180/255,180/255,180/255])

В результате получаем:

Рисунок 104 – Законченная модель
Рисунок 104 – Законченная модель
Рисунок 105 – Законченная модель
Рисунок 105 – Законченная модель

Вот и всё, Дорогие друзья! На этом, пожалуй, нашу статью и завершим. Мы рассмотрели основные примитивы и функции для работы с ними в OpenSCAD. И это только крошечная часть того, что данная программа умеет делать, ведь мы рассмотрели в этой статье только часть функций… А можно еще строить цельные модели по лежащим в пространстве 3Д объектам, делать различные анимации, строить шестерни, работать с различными цветами при построении разных объектов в одной модели и многое, многое, многое (и еще много раз слово «многое») другое. Надеюсь, что данная статья была Вам полезна. Я не утверждаю, что OpenSCAD – лучшая программа среди аналогичных, но меня вполне устраивает: в ней не нужно переключаться между слоями во время моделирования, для нее не требуется платная лицензия, а что самое главное, с помощью нее можно редактировать модели в STL-формате, что очень удобно при подготовке (редактировании) модели перед загрузкой в слайсер (для 3Д печати). Что ж, спасибо что читаете. Удачи в учебе и труде!