Здравствуйте, Дорогие друзья! В данной статье мы с Вами будем строить 3Д модели. Начнем конечно же с примитивов, а закончим полноценной моделью. Надеюсь, что Вам будет не только интересно, но и полезно это читать. Для моделирования мы будем использовать программу с открытым исходным кодом OpenSCAD.
Рисунок 1 – Скриншот справки OpenSCAD
Конечно же наиболее популярны такие системы проектирования, как FreeCAD и подобные ему, но, как по мне, в OpenSCADработать намного удобнее, чем в них. Да и весит она на порядок (а то и на два) меньше указанных выше (не говоря уж о Компасе). Для данной программы существуют примеры, но они не отличаются, как бы правильнее выразиться, полнотой. Я же постараюсь сделать свои примеры, насколько это будет возможным, подробными. Чтобы человек, который хочет начать работать в OpenSCAD мог понять не «как сделать», а «почему» и «как МОЖНО сделать». Конкретно в этой статье ничего экстраординарного мы строить не будем. Только ознакомимся с некоторыми важными функциями OpenSCAD.
Давайте заглянем в справочник OpenSCAD:
На вид ничего сложного. По сути, так оно и есть. Примитивные 3Д-объекты можно получить двумя способами: непосредственным их построением, либо выдавливанием 2Д-фигур. Начнем с привычного многим способа с выдавливанием, то есть такого, который используется при моделировании в Компасе. Из справочника к программе мы видим, что на плоскости мы можем отобразить 8 базовых фигур:
1. circle() – круг. Именно круг, а не окружность. Давайте построим его в OpenSCAD. Сделать это очень просто: открываем программу и создаем новый файл:
Рабочее окно программы включает в себя три дочерних окна: Редактор (здесь вводим программный код), Консоль (здесь отображаются прогресс построения модели и предупреждения об ошибках, если такие возникают), 3Д-Модель (здесь отображается модель, которую мы проектируем).
Для построения круга в окне Редактор введем функцию circle(). В качестве параметров передаем в функцию радиус r. Пусть он будет равен 20 мм.
По умолчанию даже 2Д объекты здесь имеют толщину (иначе их будет проблематично отобразить). По факту же никакой толщины не подразумевается. Итак, что мы можем сделать с построенным кругом? Фигура состоит из большого количества «кусочков» - элементарных фрагментов. Количество это мы можем задать самостоятельно. Для этого существует специальная переменная $fn(значок доллара указывает на то, что она специальная). Например, хотите получить из круга треугольник, вписанный в окружность заданного радиуса? Пожалуйста: вводим в редактор функцию circle, указываем радиус и чему равна специальная переменная (для треугольника, естественно, она равна 3):
Но, всё же, чтобы не путать 3Д и 2Д, давайте «поместим под нормаль» плоскость ХУ (то есть будем видеть только то, что находится в одной плоскости). На панели инструментов жмём соответствующую виртуальную кнопку:
Теперь мы видим только то, что проецируется на плоскость ХУ:
Нужно построить квадрат? Пятиугольник? Шестиугольник? Стоугольник? Не проблема: приравниваем переменную $fn к требуемому числу.
Про стоугольник я заговорил не случайно. Это по сути аппроксимированная окружность. Чем большее количество элементов мы зададим при построении фигуры, тем она точнее будет построена. Я, обычно, при построении окружностей (кругов!) задаю $fn=200. Чтобы было удобнее говорить о подобных параметрах, давайте введем собственный термин. Пусть это будет «точность воспроизведения фигуры или тела относительно их специфики», ну или просто «точность воспроизведения». Проще говоря введенная нами величина будет показывать насколько построенный круг похож на круг всамделишный, квадрат на квадрат, а сфера на сферу. Величина эта не будет абсолютной, а скорее относительной.
Так вот, точность воспроизведения можно задать не только напрямую количеством элементов, из которых состоит фигура, но и указывая параметры этих элементов. Например, мы можем задавать угол на который мы делим 360 градусов и получаем количество элементов (или угол, принадлежащий вершине элемента). За подобный способ отвечает специальная переменная $fa. Построим те же фигуры, что и ранее, но указывая при этом не параметр $fn, а параметр $fa. Для Пятиугольника $fa=360/5=72. Можно, кстати прямо дробью и задавать значение.
Почему я начал с пятиугольника, а не с треугольника, как в прошлый раз? При использовании переменной $faее наибольшим значением является 360/5, то есть 72 градуса. И даже если Вы укажете $fa=360/3 или $fa=360/4, программа всё равно построит пятиугольник.
Следующий способ, с помощью которого можно оперировать точностью воспроизведения – задать длину основания элемента (треугольника, при вращении которого и получается фигура). За данный параметр отвечает переменная $fs. Чтобы было понятней покажу на примере круга, аппроксимированного до шестиугольника:
Для примера построим круг с fs=10:
Так, уменьшая значение переменной fs, мы увеличиваем точность воспроизведения.
Задавать размер круга можно не только через радиус, но и через диаметр. Для этого указываем не «r», а «d».
С circle разобрались, переходим ко второй базовой 2Д фигуре – к прямоугольнику. Для построения прямоугольника используется команда square(). В качестве параметров в функцию передаются размеры сторон и расположение фигуры относительно начала координат. Если нам нужно построить квадрат, то достаточно указать только одно значение (длина стороны, так как все стороны у квадрата одинаковые).
Насколько можно судить, построение фигуры выполнено по умолчанию от начала координат. Если нужно, чтобы центр фигуры был расположен в начале координат, то достаточно установить позиционирование в центр:
Давайте теперь построим прямоугольник. Для этого вместо длины стороны квадрата в квадратных скобках указываем через запятую длину по иксу и по игреку:
Также, следует заметить, что кодовое слово center можно не писать – синтаксис OpenSCADэто позволяет.
Переходим к третьей примитивной фигуре – к многоугольнику. В отличие от рассмотренных ранее фигур, многоугольник предполагает наличие точных координат своих вершин, которые ему задает пользователь. Построить многоугольник можно вызвав функцию polygon(). В самом простом случае достаточно указать координаты точек в таком порядке, в котором точки будут соединяться линиями. Координаты записываются в квадратных скобках:
Есть также возможность строить фигуру, располагая указанные точки в другом порядке. Для этого на позиции, следующей за позицией координат точек, в функции указывается порядок следования точек (тоже в квадратных скобках). Нумерация точек начинается с нуля (так как они образуют массив). Например:
Порядок точек не случайно указывается в двойных квадратных скобках. Указав точки единожды можно использовать их для построения нескольких фигур:
Если объекты будут перекрывать друг друга, то второй вычтется из первого:
Функцией polygon() я почти никогда не пользуюсь, потому как это не очень удобно.
Рассмотрим еще одну функцию, без применения которой мы не сможем построить полноценную модель. Это функция text(). В качестве параметров в данную функцию задаются:
- строка (текст в кавычках):
- size – размер, указывается в миллиметрах. Чтобы указать его в pt(вдруг кому понадобится), необходимо домножить требуемый размер в pt на 0,12.
- font – шрифт (указывается в кавычках):
- haling – выравнивание по горизонтали. Принимает значения «left», «center» и «right». По умолчанию установлено значение «left», если его изменить на «right», текст сместится в левую область от точки позиционирования:
Если установить значение «center», то середина текста сместится в точку позиционирования.
- valign – выравнивание текста по вертикали. Может принимать одно значение из четырех возможных: «top», «bottom», «baseline» и «center». По умолчанию установлено значение «baseline». Если указать значение «top», то текст будет расположен под точкой позиционирования, если указать «bottom», то текст будет расположен над точкой позиционирования, если «center», то середина текста по вертикали будет совпадать с точкой позиционирования.
- spacing – интервал между символами. По умолчанию принят за единицу. Рассмотрим, что будет, если мы уменьшим интервал до 0.75:
Теперь увеличим расстояние в два раза:
- direction – направление текста. Может принимать значения «ltr»(слева-направо), «rtl»(справа-налево), «ttb» (сверху-вниз) и «btt» (снизу-вверх).
- language – язык. Здесь всё просто: указывается сокращенное значение. Например «en», «ru» и прочие. По умолчанию установлено значение «en».
- script – шрифт (на этот раз группа шрифтов). По умолчанию здесь стоит латиница. Никогда данный параметр не изменял, всё и так хорошо работает.
Теперь поговорим о том, как сделать текст полужирным или наклонным. Для этого нужно внести изменения в параметр font. Делается это следующим образом:
Шрифт (font) можно подключить любой. Главное, чтобы он был заранее установлен в папке C:\Windows\Fonts.
С текстом вроде разобрались. Идем дальше. На очереди функция import(). С помощью данной функции можно извлечь данные из любого файла форматов .dxf и .svg(для 2Д) для последующей с ними работы. У нас уже есть документы в .svg. Мы делали их в Inkscape, когда разрабатывали шаблоны рамок для чертежей. Так как в файле сохранена страница с рамкой, то не поверите, что мы получим в OpenSCAD: страницу!
Так как сам лист считается твердым телом, то он у нас и отобразился.
Импортировать 2Д объекты нужно не так уж часто, да и OpenSCAD делает экспорт обратно в их формат, скажем так «немного по-своему»: иногда толстые линии отображаются в виде двух параллельных линий без заполнения между ними. Поэтому на импорте именно 2Д объектов мы останавливаться не будем.
Для того, чтобы из 2Д-объекта получить 3Д-объект можно применить одну из двух функций: linear_extrude() или rotate_extrude(). Для примера построим примитив в виде квадрата.
Применим к объекту выдавливание по вертикали. Для этого функцию linear_extrude() нужно разместить перед описанием объекта и передать в нее параметр height. Установим значение этого параметра, скажем 5 мм.
Отлично: теперь это уже не плоская фигура, а объемное тело.
Следующим параметром, который мы с Вами рассмотрим, является twist. Значение для данного параметра задается в градусах и показывает насколько сильно объект при выдавливании будет закручен. Не понимаете смысла сказанного? Смотрите: зададим height=80, а twist=90.
Как видите, примитив за время своего движения был повернут на 90 градусов вокруг оси z. Не спорю, ребристая поверхность выглядит красиво, но если нам нужна не красота, а точность? Для того, чтобы сгладить поверхность объекта есть параметр slices. Его значение равно количеству плоскостей вдоль оси z, которые проходит примитив при выдавливании. Для примера зададим slices=400:
Следующий параметр, который мы с Вами рассмотрим – это scale. Данный параметр позволяет сжимать или растягивать наш объект вдоль одной из осей. Для примера превратим круг в овал:
Перед тем как рассмотреть функцию rotate_extrude, нам необходимо ознакомиться с функцией, которая помогает задать точку позиционирования. Данная функция носит название translate() и ее мы будем использовать при работе в OpenSCAD чаще всех других. Итак, в качестве параметра в эту функцию будет передаваться точка, то есть ее координаты. Синтаксис у функции простой:
translate([координата х, координата у, координата z])
Также следует рассмотреть функцию, позволяющую поворачивать объект вокруг указанной оси на указанное количество градусов. Эта функция носит название rotate(). В качестве параметров в нее передаются углы поворота вокруг осей в градусах.
Рассмотрим теперь в работе все три функции (translate(), rotate() и rotate_extrude()). Для примера построим примитив в виде круга и сместим его из нуля, скажем в точку с координатами [40,40,0]:
Теперь повернем получившуюся модель на 90 градусов вокруг оси х:
Обратите внимание, чем ближе функция расположена в коде к функции, создающей объект, тем раньше она будет выполнена. То есть, сначала мы строим примитив в виде круга, затем смещаем его в точку с координатами [40,40,0], потом выдавливаем вращением, а уже потом поворачиваем вокруг икса на 90 градусов.
Теперь рассмотрим 3Д-примитивы. Их всего три: куб, цилиндр и сфера. Итак, куб: под этим понятием в OpenSCADсобраны все твердотельные параллелепипеды. Функция для построения куба так и называется cube(). В качестве параметров в нее передается размер стороны или размеры сторон, если строим неравносторонний параллелепипед, а также расположение тела относительно точки позиционирования. Если размер не один, то его принято указывать в квадратных скобках:
Видите, что параметр center принимает значение «true»? В этом случае центр модели помещается в точку позиционирования. Изменим это значение на «false».
Нижний левый угол модели сместился в начало координат. Теперь давайте построим простой кубик со стороной 20 мм:
И ничего сложного. Переходим к следующему примитиву: к цилиндру. Сразу оговорюсь, что дальше я буду использовать для установки параметров гладкости модели только параметр $fn, так как считаю его наиболее удобным для этого. Итак, для того чтобы построить цилиндр используется функция cylinder(). В нее передаются такие параметры как высота модели (h), радиус окружности, лежащей в основании тела (r) или же ее диаметр (d), также указывается положение объекта относительно точки позиционирования (center, по умолчанию этот параметр «false») и параметры поверхности (та самая специальная переменная $fn). Давайте построим цилиндр высотой 20 мм и радиусом 8 мм. Прочие параметры указывать не будем. И вот что мы получим:
Как видите, объект получился сильно «аппроксимированным». Произошло это потому, что мы не указывали параметров fa, fs или fn. Укажем $fn=150 и посмотрим что будет:
Теперь поверхность модели стала более гладкой. Я бы выразился даже «более точной». Теперь сместим центр цилиндра в точку позиционирования. Для этого присвоим параметру center значение «true». Центр основания цилиндра сместится в точку позиционирования по оси Z.
И опять ничего сложного! Идем дальше. Функция cylinder() позволяет нам строить не только цилиндры, но и конусы, а также усеченные конусы. Для этого в функцию передаются не один радиус или диаметр объекта, а два, например радиус нижнего основания (r1) и верхнего (r2). Построим для примера усеченный конус высотой 15 мм, с радиусом нижнего основания 6 мм, верхнего – 2 мм. Значение параметра fnзададим равным 100, позиционирование – по умолчанию.
Думаю, Вы понимаете, что если присвоить значение 2 мм r1 и значение 6мм r2, то конус будет просто отражен по вертикали. Если нам понадобится построить обычный, не усеченный, конус, то в качестве параметра верхнего основания следует указать ноль. С цилиндром вроде разобрались. Но! Есть небольшое замечание. Следует знать, что с помощью переменной fn мы можем получить цилиндр с горизонтальным сечением в виде треугольника, квадрата, пятиугольника и т.д. Также важно учитывать размеры объекта, ведь чем они больше, тем больше должно быть значение fnчтобы цилиндр выглядел менее «ломаным».
Переходим к сфере. Сферу можно построить с помощью функции sphere(). В качестве параметров в нее передается радиус (r) или диаметр (d), а также параметр $fn. В качестве примера построим сферу с радиусом 20 мм. Количество элементов поверхности (fn) указывать не будем:
Вот так будет выглядеть сфера по умолчанию. Теперь давайте зададим fn равным, скажем, 100:
Вот об этом я как раз и говорил: размеры объекта слишком велики, поэтому нужно увеличить значение fn еще больше. Примем его равным 200:
Ну вот, так-то лучше!
Существует также дополнительный 3Д-объект. Примитивом его называть не хочется, данный объект – многогранник. Строится он с помощью функции polyhedron(). Изначально я не хотел делать описание и приводить примеры для многогранника, потому что сам ее никогда не использую, но подумав, вдруг Вам она понадобится, всё же решил про нее написать. В polyhedron() передаются координаты точек, точно также как и в polygon(), только здесь есть еще и z-координата. Также здесь обязательно нужно задавать порядок следования точек, разбивая объект на грани. Построим простой объект, скажем семигранник, для этого достаточно придумать пять точек и дублировать их (откопипастить), сместив по координате z. Затем указываем то, как точки располагаются в пространственных плоскостях, то есть на видах объекта. Делается это следующим образом:
polyhedron([[координаты точки 0],
[координаты точки 1],
[координаты точки 2],
[координаты точки 3],
[координаты точки 4],
[координаты точки 5],
[координаты точки 6],
[координаты точки 7],
[координаты точки 8],
[координаты точки 9]],
[[точки грани 1], [точки грани 2],
[точки грани 3], [точки грани 4],
[точки грани 5], [точки грани 6],
[точки грани 7]]);
Как по мне, такой способ не очень действенный.
В принципе, с примитивами на этом можно закончить. Переходим к более интересному занятию. Сделаем простой объект: болт. Для начала сделаем заготовку болта. Пусть резьба у нас будет М8 с шагом 1.25 мм. Разработку модели начнем с того, что найдём диаметральный размер головки для стандартного болта с указанными параметрами. Идём в ГОСТ 7798-70 и смотрим диаметр описанной окружности и размер под ключ. Диаметр описанной окружности 14.2 мм. Также нам нужна высота головки (5.3 мм) и длина резьбы (ее примем равной 25 мм). Никаких дополнительных элементов учитывать не будем, потому что на самом деле этим примером я хочу показать как можно быстро и красиво «нарезать» резьбу в OpenSCAD. Сначала построим основу. Это будет шестигранник и цилиндр:
Стержень я построил произвольного диаметра, потому как сейчас мы посмотрим в ГОСТ и узнаем каким он должен быть. Стандарт, к которому мы должны обратиться – ГОСТ 24705-2004. И из него нам нужно вот это изображение с описанием к нему:
Итак, что мы тут видим: P - шаг резьбы, H – высота исходного треугольника резьбы, D – номинальный диаметр резьбы, D1 и d1 – это номинальные внутренние диаметры внутренней и внешней резьбы соответственно. Вычислить эти значения можно по формулам из того же ГОСТа:
Или просто посмотреть в стандарте всё что нужно. Для того, чтобы построить резьбу, нам также понадобится значение H:
Резьбу будем строить с помощью конуса. Высоту конуса мы знаем (Н), диаметр нижнего основания тоже (Р). Остается найти радиус верхнего основания (r2). Это легко, так как мы из рисунка 80 знаем, чему равно расстояние от d3 до D:
Радиус найдем с помощью подобных треугольников, то есть для начала определим во сколько раз высота конуса больше высоты его вершины, которую мы должны срезать:
Отлично. У нас есть все необходимые значения для того, чтобы построить резьбу. Для начала строим конус и располагаем его основание на расстоянии D/2 – (17/24)H – h = 4-0.7667-0.158=3,0753 мм от нуля, скажем по иксу. Покажу в отдельном файле для наглядности, затем соединю с заготовкой.
Теперь поворачиваем конус на 90 градусов вокруг оси игреков.
Резьба формируется циклически. Пусть у нас на один виток будет приходиться 300 конусов. От количества объектов на виток зависит качество резьбы. Применим функции rotate() и translate(). Первой мы будем сдвигать образ конуса вокруг оси z, а с помощью второй постепенно поднимать его вверх. Сделаем пробный виток:
На каждой итерации цикла мы увеличиваем угол поворота на 360/300=1.2 градуса, при этом смещаем образ на приблизительно 4.2 микрона. Хотите сделать нашу резьбу более «презентабельной»? Увеличим число итераций в 5 раз:
Однако, на мой взгляд, достаточно будет и 600 объектов на один виток. Для того, чтобы построить нужное нам количество витков мы можем выполнить одно из двух действий: в текущем цикле увеличить количество оборотов образа вокруг оси (то есть сделать угол поворота не 360 градусов, а 360*количество витков), при этом увеличить и расстояние, чтобы его хватало для подъема образа на эти несколько оборотов. Либо, что более просто: поместить текущий цикл в другой цикл, с помощью которого мы сможем задавать номер строящегося витка.
Поясню код: вложенный цикл 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 мм):
Теперь правим диаметр цилиндра основы. Его истинное значение – это d1:
Сделаем некоторые улучшения модели, а заодно познакомимся с еще одной функцией. Скруглим ребра на головке. Да-да: скруглять OpenSCADтоже умеет. Делается скругление с помощью функции minkowsky(){}. Я специально поставил после нее фигурные скобки, чтобы Вы про них не забывали. Параметрами для данной функции являются два тела. Первое – скругляемое, второе – движущееся по траектории ребер первого и скругляющее его. Применим функцию, потом объясню некоторые ее особенности:
Если Вы еще не заметили, то скругляющий объект – сфера с радиусом 0.3 мм. Функция minkowsky() в прямом смысле слова строит копии указанного скругляющего объекта, смещая их на очень маленькое расстояние друг от друга, используя при этом в качестве траекторий ребра скругляемого объекта. То есть Изначальный объект (скругляемый) увеличивается в размерах на два радиуса скругляющего. Поэтому я уменьшил размеры шестигранника на 0.6 мм по горизонтали и вертикали, а также сместил его вверх на 0.3 мм. Сложно для восприятия? Это да. Постараюсь пояснить проще: у нас есть некоторый каркас, сплетенный из проволоки:
Теперь наденем на этот каркас круглые бусины:
Так мы и выполняем скругление. Думаю, теперь воспринимать то, что я говорил раньше о функции minkowsky() стало проще.
Вернемся к построению нашего болтика. Добавим модели немного реалистичности: сместим резьбу на 1 шаг вверх (на 1.25 мм) и уберем из цикла один виток.
Почему бы нам не выровнять резьбу на торце ножки? Сделаем это. Просто подрежем торчащий за ее пределы виток. Для этого применим функцию вычитания одного объекта из другого. Называется эта функция difference(){}. Первый ее параметр – тело, из которого мы будем вырезать, второй и последующие – тело, которыми мы будем вырезать. Вырезать мы будем из резьбы. А срежем мы макушку обычным цилиндром с диаметром 9 мм. Но, для того, чтобы у нас всё получилось, необходимо, чтобы OpenSCADвоспринимал нашу резьбу не как большое количество конусов, а как один объект. Для этого объединим все объекты резьбы в один, используя функцию union(){}. Параметрами в ней являются объединяемые тела.
Визуально мы этого объединения не увидим. Теперь можно и убрать лишний кусочек резьбы, торчащий за пределы ножки:
Те зеленые вкрапления, которые появились на месте среза – всего-навсего след от цилиндра, которым мы «резали» заготовку. У разных объектов в OpenSCAD разные цвета. Поэтому на ножке и остался этот след. С цветом модели мы также разберемся, но немного позже. Сейчас сделаем ножку немного длиннее и снимем с нее фаску. Ничего в прямом смысле удлинять и подрезать мы не будем. Поступим проще: построим на ножке основы усеченный конус с диаметром нижнего основания равным диаметру ножки, а диаметр верхнего основания уменьшим на высоту этого конуса. Таким образом мы получим фаску 60 градусов (так как косинус 60 градусов равен 0.5). Если хотите 45, то придется уменьшать второй диаметр на значение высоты конуса, умноженное на два. Пусть высота конуса будет равна половине шага резьбы. Тогда в результате мы получим:
Построим еще один цилиндр от головки болта до резьбы. Его высота должна быть равна сумме одного шага, на который мы сдвинули резьбу вверх ранее и диаметру верхнего основания конуса, который мы использовали для построения резьбы.
Вот болтик и готов. Хотите чтобы он выглядел реалистичнее? Что ж, в этом нет ничего сложного. Определим что в нашей модели нас не устраивает. Первым делом смотрим на головку:
Разве она не должна немного скругляться? Смотрим в ГОСТ:
Мы видим, что нам необходимо снять фаску под углом от 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). Остается решить вопрос как нам позиционировать квадрат. Нам нужно сделать следующее:
dz и dy – величины в мм, на которые нам нужно сдвинуть ЦЕНТР квадрата после поворота его на 30 градусов. Не буду грузить Вас математикой (синусами и косинусами), а просто покажу на какие значения нужно сделать сдвиг:
Применим функцию rotate() и функцию difference(). Создаем цикл под функцией minkowsky().
Получилось неплохо. Теперь добавим символьные обозначения того, что резьба метрическая и диаметр 8 мм. Для этого используем функцию text(). Выдавливание выполняем с помощью функции linear_extrude, а буквы позиционируем так, чтобы их высота составляла 0.3 мм:
Остался последний штрих: цвет детали. Для того, чтобы задавать цвета объектов в OpenSCAD есть функция color(). Параметр цвета задается в функцию разными способами. Мне больше нравится система rgb. Перекрасим нашу деталь в серый цвет. Для этого, содержимое редактора помещаем в фигурные скобки и в самое начало документа помещаем строчку:
color([180/255,180/255,180/255])
В результате получаем:
Вот и всё, Дорогие друзья! На этом, пожалуй, нашу статью и завершим. Мы рассмотрели основные примитивы и функции для работы с ними в OpenSCAD. И это только крошечная часть того, что данная программа умеет делать, ведь мы рассмотрели в этой статье только часть функций… А можно еще строить цельные модели по лежащим в пространстве 3Д объектам, делать различные анимации, строить шестерни, работать с различными цветами при построении разных объектов в одной модели и многое, многое, многое (и еще много раз слово «многое») другое. Надеюсь, что данная статья была Вам полезна. Я не утверждаю, что OpenSCAD – лучшая программа среди аналогичных, но меня вполне устраивает: в ней не нужно переключаться между слоями во время моделирования, для нее не требуется платная лицензия, а что самое главное, с помощью нее можно редактировать модели в STL-формате, что очень удобно при подготовке (редактировании) модели перед загрузкой в слайсер (для 3Д печати). Что ж, спасибо что читаете. Удачи в учебе и труде!