Перейти к содержимому

Totoro Cookies

  • записей
    9
  • комментариев
    136
  • просмотров
    114 049

3D-Принтер

Totoro

29 792 просмотра

blog-0009590001427914451.png

Трехмерная печать в Minecraft

(инструкции для самых маленьких)

Начиная с версии 1.5.4, в OpenComputers появляется интересный девайс - трехмерный принтер. Он дает возможность печатать декоративные блоки любой формы и цвета. Причем не только статичные блоки, но и двери/люки, кнопки и рычаги!

Давайте рассмотрим, для чего он может пригодиться, и как именно с ним работать.

 

2015-04-01_18.07.13.png

 

1. Цель

Как и в предыдущих гайдах, первым делом поставим себе цель.

Мы будем создавать стенную плитку со сквозным орнаментом, в виде морды крипера.

 

Я не буду приводить в этом гайде рецепты предметов, так как их легко найти в NEI, или в статьях на gamepedia.

 

2. Обзор принтера

3D-принтер - это периферическое устройство, которое должно быть подключено к работающему компьютеру. Оно представляет собой блок, с двумя внутренними слотами:

 

3DPrinter.png

 

Верхний слот предназначен для специальной печатной массы (изготовляется из редстоуна, гравия, древесного угля и воды). Принтер вмещает два стека печатной массы (256 000 ед).

Нижний слот занимает картридж с красителями. Объем внутреннего хранилища - два картриджа краски (100 000 ед).

 

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

На модель из этого гайда, состоящую из 21 фигуры, принтер потратил 424 единицы массы и 314 единиц краски.

 

3. Отпечатанный блок

Модель для печати задается в виде списка "фигур" - параллелепипедов. Каждая фигура отмечена координатами противоположных углов. Она имеет свою текстуру, цвет оттенка (если необходимо) а также состояние (true/false).

Максимальное количество фигур в модели - 24, по умолчанию.

 

Координаты блока тремя числами (X, Y, Z) в пределах от 0 до 16.

 

text4774.png

 

Блок может переключать свое состояние, когда игрок кликает по нему правой кнопкой мыши, или на блок подается сигнал редстоуна.

По умолчанию блок имеет форму, заданную блоками с состоянием false, и сменяет ее на форму из блоков с состоянием true, при активации.

 

Кроме того блок имеет несколько дополнительных общих флагов, которые определяют его название, описание и некоторые другие параметры.

 

4. Программирование принтера

Есть два способа распечатать свою модель. Через компонент принтера и прямое управление, либо при помощи стардартной программки print3d от Сангара.

 

4.1 Компонент принтера

Подключение принтера ничем не отличается от подключения любого другого устройства:

local com = require('component')local printer = com.printer3d
 

Компонент предоставляет набор функций для управления:

  • reset() - сброс настроек и остановка печати
  • setLabel(value:string) - задаем название будущего блока
  • getLabel():string - получаем текущее название
  • setTooltip(value:string) - задаем описание блока
  • getTooltip():string - получаем описание
  • setRedstoneEmitter(value:boolean) - определяет, излучает ли блок сигнал редстоуна в активированном состоянии
  • isRedstoneEmitter():boolean - возвращает true, если блок излучает сигнал в активном состоянии
  • setButtonMode(value:boolean) - определяем поведение блока при активации. Если true, то блок автоматически возвращается в неактивное состояние через несколько секунд после активации (как кнопка)
  • isButtonMode():boolean - возвращает true, если блок находится в режиме "кнопки"
  • addShape(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number, texture:string[, state:boolean=false][,tint:number]) - добавляет новую "фигуру" к форме блока. Фигура задана координатами. texture - название текстуры, state - для какого состояния фигура предназначена, tint - цвет оттенка фигуры
  • getShapeCount():number - возвращает количество фигур в модели
  • getMaxShapeCount():number - возвращает максимально возможное количество фигур
  • commit([count:number]) - посылает принтеру текущую конфигурацию и начинает печать (count - количество копий, если не задано - равно 1)
  • status(): string, number or boolean - возвращает состояние принтера - "buzy" и процент готовности, или "idle" и готовность предмета (true/false).

4.2 Программа print3d

Код программы не включен в мод по умолчанию, поэтому его надо скачать из интернета.

Последнюю версию можно найти на ГитХабе автора: https://github.com/OpenPrograms/Sangar-Programs/blob/master/print3d.lua

Либо скачать с Pastebin: http://pastebin.com/b5rD8KcY

(поставьте интернет-плату, и наберите в консоли компьютера команду pastebin get b5rD8KcY print3d)

 

Эта программа по сути, читает параметры модели из текстового файла и передает принтеру.

Формат вызова программы:

print3d FILE [count]
 

Где FILE - название файла с моделью, а необязательный параметр count - количество копий модели.

 

Модели имеют простой формат - все параметры записываются в таблицу, по аналогии с Луа. Вот образец файла с моделью.

{  -- Это - название модели. Т.е. название будущего блока, которое будет видно  -- в инвентаре и подсказке Waila. Название по умолчанию - "3D Print"  label = "Example Model",  -- Это описание предмета, такое, как будет видно в инвентаре. Если не задано,  -- предмет не будет иметь описания  tooltip = "Это демонстрационная модель, показывающая все возможности",  emitRedstone = false, --[[ Если этот параметр равен false, блок работает как                             дверь, сменяя свое состояние при сигнале редстоуна.                             Если параметр равен true, блок работает как кнопка                             или рычаг - излучая сигнал при смене состояния.                             При этом блок не реагирует на сторонний сигнал.                             По умолчанию параметр равен false. ]]  buttonMode = false,   --[[ Если этот параметр равен false, модель работает как                              дверь или рычаг - то есть остается в том состоянии,                             в которое установлен игроком.                             Если параметр равен true, модель автоматически возвращается                             в неактивное состояние через несколько секунд после                             активации.                             По умолчанию параметр равен false. ]]  -- Это список фигур модели, которые определяют, как она выглядит.  -- Модель должна содержать как минимум одну фигуру (параллелепипед)  -- в неактивном состоянии.  -- Фигуры не могут быть "плоскими" т.е. не иметь объема.  -- Каждая фигура задана шестью числами: minX, minY, minZ, maxX, maxY, maxZ.  -- (Координаты двух противоположных углов.)  -- Если смотреть спереди, ось X направлена вправо, ось Y - вверх и ось Z - вглубь.  -- Дополнительно, каждая фигура длолжна обладать текстурой. Для того чтобы  -- определить название текстуры, вы можете воспользоваться Определителем Текстуры  -- (Texture Picker), кликнув им по нужному блоку.  --  -- Модель имеет два состояния - неактивное (false, состояние по-умолчанию)  -- и активное (true, состояние после активации блока).  shapes = {    -- Фигура идет от точки <0, 0, 0> (левый нижний угол) до <8, 8, 8> (середина),    -- и имеет текстуру блока лазурита.    { 0, 0, 0, 8, 8, 8, texture = "lapis_block" },    -- Фигура идет из точки <8, 8, 8> (середина) в <16, 16, 16> (правый верхний угол),    -- и закрашена текстурой дубовой листвы. Фигура принадлежит активному состоянию    -- модели и имеет светло-зеленый оттенок.    { 8, 8, 8, 16, 16, 16, texture = "leaves_oak", state = true, tint = 0x48B518 }  }}
 

Т.е. описание модели просто содержит перечень всех тех параметров, которые задаются при помощи компонента, и список фигур из которых модель состоит.

 

2015-04-01_17.59.31.png

 

Набор тестовых моделей для изучения, можно найти здесь: https://github.com/OpenPrograms/Sangar-Programs/tree/master/models

 

5. Проектирование модели

Разобьем мысленно рисунок запланированной модели на параллелепипеды.

Она будет представлять собой тонкую плитку посередине блока, наподобие стекла или решетки.

 

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

{ label = "Плитка 'Морда крипера'", emitRedstone = true, buttonMode = false, tooltip = "Секретный рычаг в виде головы крипера" shapes={  {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200},  {0,2,7,  2,14,9,  texture="quartz_block_side", tint=0x8eb200},  {6,10,7, 10,14,9, texture="quartz_block_side", tint=0x8eb200},  {14,2,7, 16,14,9, texture="quartz_block_side", tint=0x8eb200},  {2,2,7,  4,10,9,  texture="quartz_block_side", tint=0x8eb200},  {4,8,7,  6,10,9,  texture="quartz_block_side", tint=0x8eb200},  {10,8,7, 12,10,9, texture="quartz_block_side", tint=0x8eb200},  {12,2,7, 14,10,9, texture="quartz_block_side", tint=0x8eb200},  {6,2,7,  10,4,9,  texture="quartz_block_side", tint=0x8eb200},  {0,0,7,  16,2,9,  texture="quartz_block_side", tint=0x8eb200},  {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200, state=true},  {0,2,7,  2,14,9,  texture="quartz_block_side", tint=0x8eb200, state=true},  {6,10,7, 10,14,9, texture="quartz_block_side", tint=0x8eb200, state=true},  {14,2,7, 16,14,9, texture="quartz_block_side", tint=0x8eb200, state=true},  {2,2,7,  4,10,9,  texture="quartz_block_side", tint=0x8eb200, state=true},  {4,8,7,  6,10,9,  texture="quartz_block_side", tint=0x8eb200, state=true},  {10,8,7, 12,10,9, texture="quartz_block_side", tint=0x8eb200, state=true},  {12,2,7, 14,10,9, texture="quartz_block_side", tint=0x8eb200, state=true},  {6,2,7,  10,4,9,  texture="quartz_block_side", tint=0x8eb200, state=true},  {0,0,7,  16,2,9,  texture="quartz_block_side", tint=0x8eb200, state=true},  {2,2,8,  14,14,9, texture="quartz_block_side", tint=0xe0301e, state=true}}}
 

Итак, наша плитка имеет двойной набор фигур - для двух состояний, окрашенных в текстуру кварца с зеленым оттенком.

Кнопка будет работать как рычаг, испуская сигнал в активном состоянии.

 

Откройте файл командой open creeper.

Скопируйте код плитки выше и вставьте в файл кнопкой [insert].

Затем сохраните ([Ctrl]+) и покиньте редактор ([Ctrl]+[W]).

 

6. Печать

Все готово, принтер заправлен, модель спроектирована.

Отправляем ее на печать!

print3d creeper
 

7. Итоги

 

2015-04-01_17.35.55.png

 

2015-04-01_18.12.35.png

 

2015-04-01_18.12.36.png

 

Enjoy!

  • Нравится 11
  • Спасибо 2


29 комментариев


Рекомендуемые комментарии



Очень познавательно!!! Спасибо, Дмитрий, за великолепный гайд!

Микроблоки и вообще декор-моды курят нервно в тамбуре. Можно создать любой блок, статуэтку, награду за ивент и любой сюжетный артефакт или просто декор. 

Поделиться комментарием


Ссылка на комментарий

 

 

Координаты блока тремя числами (X, Y, Z) в пределах от 0 до 16.

Интуиция мне подсказывает, что от 0 до 15 или от 1 до 16.

Или же не слушать её?

Поделиться комментарием


Ссылка на комментарий

Интуиция мне подсказывает, что от 0 до 15 или от 1 до 16.

Или же не слушать её?

Не слушай ее, она врет. =)

Длина стороны куба - 16. Координаты параллелепипедов устанавливаются не по центру "вокселей", а в "узлах сетки". То есть 0, 1, 2, 3, 4, ... , 14, 15, 16. Где 0 - это самая левая грань куба, а 16 - сама правая.

Поделиться комментарием


Ссылка на комментарий

Поправочка: используя лутовскую дискету с программкой oppm можно выкачать программу print3d из интернета. И скачается она как раз из репозитория OpenProgramms на GitHub. =)

Поделиться комментарием


Ссылка на комментарий

вот что интересно: у меня есть блок который я хочу скопировать и у него есть верхняя , боковая и нижняя сторона . как мне это скопировать ?

Поделиться комментарием


Ссылка на комментарий

вот что интересно: у меня есть блок который я хочу скопировать и у него есть верхняя , боковая и нижняя сторона . как мне это скопировать ?

 

Поскольку поставить на отдельные стороны одного параллелепипеда разные текстуры не выйдет, предлагаю сделать фейковые стороны из разных боксов.
Например - так:
{
 label = "Фейк",
 tooltip = "Поддельный верстак",
 shapes={
  {0,15,0, 16,16,16, texture="crafting_table_top"},
  {0,0,0,  16,15,1,  texture="crafting_table_side"},
  {0,0,15, 16,15,16, texture="crafting_table_side"},
  {0,0,1,  1,15,15,  texture="crafting_table_side"},
  {15,0,1, 16,15,15, texture="crafting_table_side"}
 }
}

Результат:

2015-04-07_21.28.51.png

 

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

Поделиться комментарием


Ссылка на комментарий

Тоторо, в коде(или описании?) модели-примера ошибка. В строке tooltip нет запятой(

tooltip = "Секретный рычаг в виде головы крипера"

 

shapes={ {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200},)

Поделиться комментарием


Ссылка на комментарий
В 02.04.2015 в 12:06, Xom сказал:

Ждем сторонний редактор для создания 3д моделек)

может напишем...

мне интересно стало...

но. я начинающий прогер.

или создать плагин к какому нибудь 3д редактору.

создадим тему, найдём энтузиастов,

подождём...

ещё...

и ещё...

и ещё долго-долго...

====> PROFIT!

Поделиться комментарием


Ссылка на комментарий

может напишем...

мне интересно стало...

 

Пост старый, и с тех пор появились кое какие инструменты уже.

 

1) Можно конвертировать в принты воксельные модельки.

Рисуем модель в MagicaVoxe экспортируем в *.vox формат, конвертируем на конвертере.

 

2) Редактировать в онлайн 3D редакторе.

Искать тут. Справка тут.

Поделиться комментарием


Ссылка на комментарий

Ребятки, как сделать так, чтобы при смене состояния шейпа, он исчезал или чтобы через него можно было бы пройти?

Поделиться комментарием


Ссылка на комментарий

Помогите сделать, чтоб при использовании блока, с ним использовался другой, например двухблочная напечатанная дверь

Поделиться комментарием


Ссылка на комментарий

@EFL а я без понятия:) Не особо я любитель 3d принтов, только какие-то фонарики когда-то печатал и жалюзи когда-то себе делал кастомные)

Попробуй одну дверь напечатать так, чтобы при открывании она генерила редстон сигнал, а вторую дверь точно такую-же наоборот сделай, чтобы она становилась открытой при наличии редстона. Может как-то это и сработает. Что-то я слышал о том, что эти принты что-то такое умеют делать и могут менять свои состояния от реда и также вроде ред излучать. Это лучше Totoro или Newbie напиши, или другим игрокам старожилам 3д-принтерщикам, которые на этом крипера съели и знают все нюансы этой хиромантии 3д-шной:)

Поделиться комментарием


Ссылка на комментарий

@Alex я совсем новичек в этом деле, думал как то через if можно сделать, но ума не приложу как, собственно сама дверь 

Скрытый текст

 


label = "ДВЕР", 
emitRedstone = true,
shapes = { 
{ 0,0,0,15,4,2,texture = "cobblestone" }, 
{ 15,0,0,16,16,1,texture = "planks_big_oak" }, 
{ 15,0,1,16,16,2,texture = "cobblestone" }, 
{ 0,4,0,1,9,2,texture = "iron_block" }, 
{ 1,4,0,3,16,2,texture = "cobblestone" }, 
{ 7,4,0,15,16,2,texture = "cobblestone" }, 
{ 0,9,0,15,11,2,texture = "cobblestone" }, 
{ 0,11,0,3,16,2,texture = "cobblestone" }, 

{ 0,0,0,2,4,15,texture = "cobblestone", state = true }, 
{ 0,0,15,1,16,16,texture = "cobblestone", state = true }, 
{ 1,0,15,2,16,16,texture = "planks_big_oak", state = true }, 
{ 0,4,0,2,9,1,texture = "iron_block", state = true }, 
{ 0,4,1,2,16,2,texture = "cobblestone", state = true }, 
{ 0,4,6,2,16,15,texture = "cobblestone", state = true }, 
{ 0,9,0,2,11,15,texture = "cobblestone", state = true }, 
{ 0,11,0,2,16,2,texture = "cobblestone", state = true }, 

}, 


label = "ДВЕР", 
emitRedstone = true,
shapes = { 
{ 0,0,0,15,2,2,texture = "cobblestone" }, 
{ 15,0,0,16,16,1,texture = "planks_big_oak" }, 
{ 15,0,1,16,16,2,texture = "cobblestone" }, 
{ 0,2,0,3,9,2,texture = "cobblestone" }, 
{ 7,2,0,15,16,2,texture = "cobblestone" }, 
{ 3,7,0,15,9,2,texture = "cobblestone" }, 
{ 0,9,0,1,14,2,texture = "iron_block" }, 
{ 1,9,0,3,16,2,texture = "cobblestone" }, 
{ 0,14,0,15,16,2,texture = "cobblestone" }, 

{ 0,0,0,2,2,15,texture = "cobblestone", state = true }, 
{ 0,0,15,1,16,16,texture = "cobblestone", state = true }, 
{ 1,0,15,2,16,16,texture = "planks_big_oak", state = true }, 
{ 0,2,0,2,9,2,texture = "cobblestone", state = true }, 
{ 0,2,6,2,16,15,texture = "cobblestone", state = true }, 
{ 0,7,2,2,9,15,texture = "cobblestone", state = true }, 
{ 0,9,0,2,14,1,texture = "iron_block", state = true }, 
{ 0,9,1,2,16,2,texture = "cobblestone", state = true }, 
{ 0,14,0,2,16,15,texture = "cobblestone", state = true }, 

}

 

 

Поделиться комментарием


Ссылка на комментарий

неее, через if вряд ли это можно сделать:) Есть у меня подозрение, что принты, это не программа, и напечатанная дверь никакого луа кода не выполняет. Это просто набор параметров 3д модели.

Поделиться комментарием


Ссылка на комментарий

@Alex видел рекламу вашего проекта, там человек демонстрировал напечатанную комнату, кухню, у него были шторы 2х2 блока, которые закрывались 2-мя кликами, т.е. кликами по верхним блокам( нижние активировались автоматически)

Поделиться комментарием


Ссылка на комментарий

@EFL ну вот я же за это тебе и говорю. Верхние шторы там скорее всего при открывании генерили редстон сигнал, а нижние открывались по редстону. Вот и все. Поискать нужно на форуме эти шторы. Или напиши Newbie в ЛС. Если мне не изменяет память, это он там эпические умывальники печатал, шахматки, шторы и даже робота Байта отбабахал величиной 9 на 9 блоков с эпической детализацией. Напиши ему в ЛС, думаю он подскажет, или задай вопрос в наш вопросник по программированию. В блогах оно тут потеряется.

Поделиться комментарием


Ссылка на комментарий

Гость
Добавить комментарий...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...