Я люблю играть в настольные игры. Я играю не реже одного раза в неделю с обычной группой и гораздо чаще с женой, когда дети уложены спать. В последнее время я больше всего увлекался играми, такими как рисование миниатюр или возвращение к Magic the Gathering (не судите меня). Когда я получил в подарок на Рождество 3D-принтер, я точно знал, что хочу с ним делать: делать детали и вставки для настольных игр. Наличие отличной вставки действительно может помочь со временем настройки / разборки игры, а это означает, что у вас будет больше времени для игры.

Раньше я делал несколько вставок из пенопласта, и они оказались неплохими. Но проблема пенопласта в том, что резка казалась неточной. Может, я просто плохо умею мерять или пользоваться ножом EXACTO. Кроме того, 5-миллиметровый пенопласт, который я использовал, начал сокращать количество места, с которым мне приходилось работать, особенно если я хотел сделать много небольших зацепок. Я надеялся, что 3D-печать позволит мне с большей точностью создавать более сложные конструкции, чем с пенопластом.

Это была мечта, но мне нужно было с чего начать. Одна из первых вставок из пеноматериала, которую я сделал, была для игры Тима Фауэрса Burgle Bros. Это фантастическая кооперативная игра, когда вы работаете вместе как банда воров, грабящих банк. Искусство потрясающее, и оно поставляется в этой действительно симпатичной коробке. Под милым я подразумеваю, что он не только красивый, но и крошечный. Мы всегда будем шутить, что пытаться вернуть все фишки в коробку - это игра после игры. В любом случае у меня был дизайн существующей вставки, которую я ранее сделал для этой игры. Теперь все, что мне нужно было сделать, это превратить этот дизайн в то, что я мог бы распечатать.

Грунтовка для 3D-печати

О том, как работают 3D-принтеры, написано много статей, поэтому позвольте мне перейти к наиболее важным частям. Мой принтер Ender3 и большинство принтеров FDM используют g-код для программирования своих движений. Где должно быть сопло, насколько горячим должно быть сопло или слой, а также когда и сколько нити нужно извлечь, все это контролируется g-кодом. Я очень мало знаю о g-коде, и, к счастью, вам это не нужно, если вы хотите что-то напечатать. Большинство распечаток выполняется путем запуска 3D-модели, такой как файл STL, через программу, называемую слайсером, для вывода необходимого g-кода для печати. Я использую бесплатный слайсер под названием Cura, который я настроил для своего принтера и используемой нити. Сам этот процесс потребовал множества проб и ошибок, но сегодня это не тема для обсуждения.

При этом мы понимаем суть проблемы. Если мы хотим что-то напечатать на 3D-принтере, нам нужна его модель. На таких сайтах, как Thingiverse доступно множество моделей, но кто-то должен быть тем, кто приступит к созданию этих дизайнов. Если вы умеете пользоваться программным обеспечением для 3D-моделирования, тогда вы должны чувствовать себя как дома. Я провел несколько первых экспериментов с TinkerCAD, но меня быстро разочаровало однообразие того, что я хотел сделать. Я просто хотел сделать несколько коробок и вырезать из них дырочки. Использование графического интерфейса было таким неточным, поэтому я начал искать способ получше.

Создание файлов STL с помощью Python

Когда я впервые рассмотрел 3D-печать с помощью Python, я подумал, что могу сразу приступить к созданию необходимого g-кода. Я быстро отказался от этого подхода. Было не так много хороших ресурсов, и в конечном итоге g-код - не лучший формат для обмена, потому что он содержит встроенную конфигурацию для конкретной машины и нити. Изучая, как я могу программно создавать файлы STL, я наткнулся на OpenSCAD, а затем на SolidPython. OpenSCAD имеет встроенный язык сценариев, который можно использовать для создания твердых форм путем построения их как композиции и пересечения других форм. SolidPython - это библиотека Python, которая позволяет вам писать Python, который можно преобразовать в OpenSCAD, который может генерировать файлы STL.

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

Делаем нашу первую коробку

Давайте сделаем нашу первую открытую коробку. Это будет фундаментальный строительный блок для всех наших вкладышей для настольных игр. Именно здесь мой предыдущий эксперимент с TinkerCAD помог мне визуализировать то, что мне нужно было сделать. Открытый бокс может быть создан из двух форм: внешнего прямоугольного тела, которое образует дно и стенки, и внутреннего прямоугольного тела, которое представляет собой отрицательное пространство, которое формирует внутреннюю часть коробки. Внутреннее твердое тело должно быть немного меньше внешнего, и эта разница будет определять толщину стен. Мы можем регулировать толщину дна по вертикали внутри коробки. Здесь я решил сделать и стенки, и дно толщиной 3 мм.

# box.py
import solid
# Size for our box
length, width, height = 100, 150, 50
# Wall thickness
wall = 3
box = solid.cube(size=[length, width, height])
# Inner box needs to be smaller based on the wall size
inside = solid.cube(
    size=[length - 2 * wall, width - 2 * wall, height - wall])
# Offset inner box
inside = solid.translate([wall, wall, wall])(inside)
# Remove inner box from the outer to create the empty space
box += solid.hole()(inside)
solid.scad_render_to_file(box, "box.scad", include_orig_code=False)

Запуск этого сценария приведет к выходу файла box.scad, который мы можем преобразовать в файл STL с помощью OpenSCAD.

# Make sure you have SolidPython installed
$ python -m pip install solidpython
# Run the above script saved as box.py
$ python box.py
# Convert scad to stl
$ openscad -o box.stl box.scad

Теперь этот файл STL готов для нашего слайсера. Мы можем сделать это немного красивее, закруглив углы. Не знаю, почему мне это кажется более привлекательным. Может быть, я показываю свой возраст веб-разработчика, когда закругленные углы были в моде. В любом случае, чтобы скруглить каждый из углов, мы добавим цилиндр к каждому из углов. Благодарю Уильяма Адамса на Thingiverse за его пост с примером SCAD за основу этой логики.

# box.py (continued)
def roundbox(size, radius):
    """Box with rounded edges."""
    x, y, z = size
    # Adjust the box size to maintain the original dimensions
    x = x - radius * 2
    y = y - radius * 2
    z = z - 1
    return solid.minkowski()(
        solid.cube(size=[x, y, z]),
        solid.cylinder(r=radius),
    )

Чтобы использовать это в примере окна, замените вызовы solid.cube () на вызовы roundbox. Мы будем использовать эту функцию для нашей вставки.

Создание вставки Burgle Bros

Когда у нас есть логика для создания открытого блока, мы не так уж далеки от того, что хотим для нашей вставки. Как я уже упоминал, я ранее создавал эту вставку в пенопласте, поэтому с самого начала у меня был план. Моя вставка была сделана из двух тонких коробок, одна с четырьмя равными отделениями для жетонов, а другая с тремя отделениями для игральных костей, охранных пешек и пешек игроков. Поскольку толщина пенопласта составляет около 5 мм, а толщина отпечатанных стен должна была быть всего 3 мм, мне пришлось немного скорректировать размеры. Это дало мне больше места для работы в этой и без того тесной коробке. Обе коробки имеют размеры 171 мм x 60 мм x 15 мм, но внутри них есть углубления разного размера для хранения различных предметов.

# box.py (continued)
wall = 3
# Tokens holder
x, y, z = 171, 60, 15
box = roundbox([x, y, z], radius=2)
# Make 4 equal size wells
wells = 4
size = (x - (wells + 1) * wall) / wells
well = roundbox([size, y - wall * 2, z - wall], radius=2)
for i in range(wells):
    box += solid.hole()(solid.translate(
        [wall * (i + 1) + size * i, wall, wall])(well))
# Output box to SCAD file
solid.scad_render_to_file(
    box, "tokens.scad", include_orig_code=False)
# Character, guards and dice holder
x, y, z = 171, 60, 15
box = roundbox([x, y, z], radius=2)
# Character holder (77 mm)
characters = roundbox([77, y - wall * 2, z - wall], radius=2)
box += solid.hole()(solid.translate([wall, wall, wall])(characters))
# Guard holder (52 mm)
guards = roundbox([52, y - wall * 2, z - wall], radius=2)
box += solid.hole()(solid.translate(
    [wall * 2 + 77, wall, wall])(guards))
# Dice holder (30 mm)
dice = roundbox([30, y - wall * 2, z - wall], radius=2)
box += solid.hole()(solid.translate(
    [wall * 3 + 77 + 52, wall, wall])(dice))
# Output box to SCAD file
solid.scad_render_to_file(
    box, "characters.scad", include_orig_code=False)

Объединение этого с нашим предыдущим кодом и его запуск сгенерируют файлы SCAD, которые снова можно преобразовать в файлы STL с помощью интерфейса командной строки OpenSCAD.

# Run the above script saved as box.py
$ python box.py
# Convert scad to stl
$ openscad -o tokens.stl tokens.scad
$ openscad -o characters.stl characters.scad

Теперь у нас есть два файла STL, которые мы можем загрузить в выбранный срез. Используемые вами настройки печати будут зависеть от вашего принтера, но я напечатал свой с толщиной слоя 0,2 мм, что обеспечило достаточную точность для этих простых форм. Фигуры не имеют вертикального выступа, поэтому для них не требуются опоры. Вы можете добавить юбку или край для лучшего прилегания к постели. В некоторых из моих ранних тестов были проблемы со скручиванием нижних слоев. Это было решено путем снижения температуры сопла, которая будет зависеть от материала, который вы используете.

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

Здорово, когда можно объединить несколько увлечений или интересов. Иметь 3D-принтер для изготовления этих вставок - полная роскошь. Приложив немного математики, немного планирования и терпения, вы сможете сделать хорошо подходящие вставки. Для меня программирование логики на Python упростило мне понимание и выполнение. Это забавная задача, если вам нравится математика и головоломки, как я. Я буду следить за некоторыми из моих более сложных дизайнов вставок в будущих публикациях, так что если вам понравился этот, ждите их.