Скриптовые твёрдые тела
Boxshot поддерживает три типа твёрдых тел: простые, сложные и скриптовые.
- Простые твёрдые тела — базовые геометрические фигуры, такие как сферы или цилиндры.
- Сложные твёрдые тела — создаются комбинированием простых тел с помощью булевых операций. Хранятся как комбинации простых фигур. Boxshot сохраняет внутреннюю иерархию этих комбинаций, что ограничивает возможности настройки результирующей фигуры.
- Скриптовые твёрдые тела — обеспечивают большую гибкость в определении фигуры, но требуют программирования геометрии на JavaScript. Этот подход имеет свои плюсы и минусы, но предоставляет дополнительный способ создания сложных твёрдых тел.
Этот урок охватывает API для работы с твёрдыми телами в Boxshot.
Создание скриптового твёрдого тела
В Boxshot нет прямого способа создать скриптовое твёрдое тело. Нужно сначала создать простое или сложное твёрдое тело, затем преобразовать его в скриптовое. Создадим простой цилиндр и изучим доступные опции:

Помимо обычных параметров фигуры справа, внизу есть кнопка Convert to script. Нажмите её и посмотрите, что произойдёт:

Правая панель обновилась: все параметры цилиндра исчезли, появилась кнопка редактора скрипта. Нажмите её, чтобы открыть редактор:

Вы увидите две панели: левая отображает код, правая — предпросмотр фигуры. Здесь вы редактируете скрипт и видите обновлённую фигуру. Подробности — ниже; пока просто замените 10 на 20 в левой панели:

Boxshot автоматически обновляет правую панель через несколько секунд после завершения редактирования. Обратите внимание: цилиндр справа стал выше — потому что вы изменили его высоту в скрипте.
Наконец, нажмите OK в правом нижнем углу для подтверждения изменений и возврата в сцену:

Сравните с начальным размером цилиндра на предыдущих скриншотах, чтобы увидеть разницу.
Так создаются и редактируются скриптовые твёрдые тела в Boxshot: создаёте твёрдое тело, преобразуете в скриптовое, редактируете скрипт и видите результат.
Скорее всего, вы будете использовать эту функцию для сложных твёрдых тел — особенно когда уже есть базовая фигура, требующая точной настройки. Однако начинать с простого тела тоже можно.
Функции создания фигур
Вернитесь в редактор скрипта и замените код слева на следующий:
box(15, 10, 5);
Через несколько секунд справа появится параллелепипед. Обновите код:
box(15, 10, 5);
box(5, 3, 10);
Вы увидите два параллелепипеда разных цветов. Функция box() создаёт элемент-параллелепипед как часть твёрдого тела. Вот полный синтаксис:
box(length, width, height, radius, cx, cy, cz);
Первые три параметра обязательны и определяют размеры. Параметр radius задаёт радиус скругления краёв, последние три — центр. Радиус и центр по умолчанию равны нулю.
Попробуйте изменить код:
box(15, 10, 5);
box(5, 3, 10, 1, 0, 0, 10);
Малый параллелепипед получил скруглённые края и размещён над большим.
Вот все функции создания фигур в API скриптовых тел Boxshot:
box(length, width, height, radius, cx, cy, cz)
sphere(radius, cx, cy, cz)
cylinder(radius, height, edge_radius, cx, cy, cz)
prism(bottom_radius, num_edges, height, edge_radius, cx, cy, cz)
torus(radius1, radius2, cx, cy, cz)
cone(bottom_radius, height, top_radius, edge_radius, cx, cy, cz)
Имена параметров говорят сами за себя. Радиус края и центр всегда опциональны со значением по умолчанию ноль.
Попробуйте каждую из функций в редакторе и посмотрите, как параметры влияют на фигуру в предпросмотре.
Булевы функции
Программирование простых твёрдых тел интересно — но с булевыми операциями ещё интереснее.
Вот скриптовые функции для булевых операций над твёрдыми телами:
intersect(shape_a, shape_b, fillet)
add(shape_a, shape_b, fillet)
sub(shape_a, shape_b, fillet)
Первый параметр — shape_a — должен быть другим объектом твёрдого тела, второй — shape_b — может быть другим объектом или массивом таких объектов.
Объект A особенно важен только для операции вычитания, но мы сохранили единообразие во всех функциях. Это связано с тем, что результаты могут различаться в зависимости от “главного” объекта.
Параметр fillet опционален и по умолчанию равен нулю. Он управляет скруглением краёв, добавленных булевой операцией — так же, как при выполнении булевой операции через меню Tools.
Изменим предыдущий пример с двумя параллелепипедами:
b1 = box(15, 10, 5);
b2 = box(5, 3, 10);
b3 = sub(b1, b2, 1);
Вы получите параллелепипед с квадратным отверстием в центре. Теперь попробуйте заменить код:
b1 = box(15, 10, 5);
b2 = sphere(3);
b3 = sub(b1, b2, 1);
На этот раз — параллелепипед со сферическим отверстием. Теперь замените sub на add и сделайте сферу немного больше:
b1 = box(15, 10, 5);
b2 = sphere(4);
b3 = add(b1, b2, 1);
Получится параллелепипед с гладкой сферической выпуклостью в центре — результат объединения параллелепипеда и сферы.
Иерархия фигур
Обратите внимание на разницу между ранними и поздними примерами скриптов:
// первые примеры
box(15, 10, 5);
box(5, 4, 10);
// поздние примеры
b1 = box(15, 10, 5);
b2 = box(5, 4, 10);
Вначале мы просто просили Boxshot добавить фигуру в твёрдое тело. Затем стали использовать эти фигуры для булевых операций, что потребовало отслеживания созданных фигур — так появились переменные. Каждая скриптовая функция, создающая, комбинирующая или изменяющая фигуры, возвращает новую фигуру, которую можно сохранить в переменную для дальнейшего использования.
Примечание: это “расслабленный” JavaScript — мы не используем ключевые слова “const” или “let” для объявления переменных. Можно их использовать при желании, но Boxshot этого не требует, поэтому мы опустим их в этом уроке.
Важная концепция в скриптовых твёрдых телах Boxshot: если вы создаёте фигуру и не используете её в другой операции, она будет отображаться как есть. Но если использовать её в другой операции — она не появится в сцене.
Посмотрите на ранние примеры со сложением и вычитанием параллелепипедов и сфер. В предпросмотре виден только результирующий объект, не исходные — потому что исходные объекты были поглощены булевой операцией. Это поведение очевидно, но иногда хочется сохранить исходный объект видимым. Вот как:
b1 = box(15, 10, 5);
b2 = box(5, 3, 10);
b3 = sub(b1, b2, 1);
b2.keep = true;
Обратите внимание на последнюю строку — она устанавливает свойство “keep” малого параллелепипеда “b2” в true. Так можно сохранить элемент видимым, даже если он используется другой функцией. Это полезно при отладке фигуры для проверки корректности её частей.
Перемещение элементов
В API скриптовых тел есть ещё несколько функций для смещения и поворота фигур:
move(shape, dx, dy, dz)
rotate_x(shape, angle, cx, cy, cz)
rotate_y(shape, angle, cx, cy, cz)
rotate_z(shape, angle, cx, cy, cz)
transform(shape, mat)
Каждая функция принимает объект фигуры как первый параметр и трансформирует его согласно названию. move() смещает фигуру на три заданных значения. rotate_x(), rotate_y() и rotate_z() поворачивают фигуру на угол, заданный параметром angle (в градусах), вокруг опциональной центральной точки, определяемой тремя опциональными параметрами (по умолчанию ноль).
Функция transform() трансформирует фигуру с помощью матрицы из 16 элементов. Вы редко будете использовать эту функцию напрямую, но Boxshot использует её при преобразовании сложной фигуры в скриптовую.
Как и булевы функции, функции трансформации возвращают новую трансформированную фигуру и скрывают исходную — так что в сцене видна только новая.
Обратите внимание: даже если исходная фигура скрыта, она всё ещё существует и может использоваться в других операциях. Например, вот как сделать два отверстия в параллелепипеде:
b1 = box(15, 10, 5); // большой параллелепипед
b2 = box(3, 5, 10); // малый
b3 = move(b2, 4, 0, 0); // смещённая копия малого
b4 = sub(b1, [b2, b3], 0.2); // вычитаем оба малых из большого
// раскомментируйте строки ниже, чтобы увидеть оба малых
// b2.keep = true;
// b3.keep = true;
Здесь мы создаём большой параллелепипед “b1”, затем малый “b2” и смещаем его по оси X, получая малый “b3”. “b2” становится скрытым, так как используется функцией move(), но мы всё ещё можем использовать его в операции sub(). Раскомментируйте две строки внизу, чтобы увидеть исходные параллелепипеды.
Параметры фигур
Boxshot назначает случайные цвета элементам твёрдого тела, но это можно переопределить:
b1 = box(15, 10, 5);
b2 = box(3, 5, 10);
b1.previewColor = "red";
b2.previewColor = "#008000";
Большой параллелепипед станет красным, а малый — тёмно-зелёным. Можно использовать обычные названия цветов или hex-коды как в HTML.
Кроме цветов, есть ещё несколько настраиваемых параметров. Вот полный список:
b1 = box(15, 10, 5);
b1.keep = true;
b1.previewColor = "red"; // цвет предпросмотра
b1.material = "Surface 1"; // имя материала Boxshot
b1.name = "Element 1"; // имя меша Boxshot
b1.smooth = 0.5; // качество 50%
b1.mapping = UV.SphericalX; // сферическое наложение по оси X
Свойства material и name задают имя и материал меша, создаваемого в Boxshot. Это важно, если нужно назначить разные материалы отдельным элементам твёрдого тела для раздельной настройки.
Параметры smooth и mapping аналогичны тем, что есть в пользовательском интерфейсе при настройке твёрдого тела. Вот полный список возможных значений mapping:
- UV.Box
- UV.PlanarX
- UV.PlanarY
- UV.PlanarZ
- UV.CylindricalX
- UV.CylindricalY
- UV.CylindricalZ
- UV.SphericalX
- UV.SphericalY
- UV.SphericalZ
Они точно такие же, как в пользовательском интерфейсе для твёрдых тел, и аналогичны режимам UV-наложения в редакторе вложенных моделей.
Обратите внимание: скриптовые значения переопределяют параметры, настроенные в пользовательском интерфейсе.
Это JavaScript
И ещё: это JavaScript, так что можно выйти за рамки простого построчного создания фигур. Вот пример создания параллелепипеда с сеткой круглых отверстий:
// сначала делаем большой плоский параллелепипед
b1 = box(20, 20, 2);
grid = []; // готовим массив цилиндров
// два цикла для создания сетки
for (x = -9; x <= 9; x += 3) {
for (y = -9; y <= 9; y += 3) {
// создаём цилиндр
c = cylinder(0.8, 5, 0, x, y, 0);
// раскомментируйте, чтобы увидеть цилиндры
// c.keep = true;
// добавляем в массив
grid.push(c);
}
}
// делаем отверстия, вычитая массив
// цилиндров из большого плоского параллелепипеда
b2 = sub(b1, grid, 0);
Вставьте этот скрипт в редактор и увидите параллелепипед с 49 отверстиями.
Подсказка: для максимальной отдачи от скриптовых твёрдых тел не обязательно изучать JavaScript — вокруг много AI-помощников. Дайте этот урок и этот пример скрипта вашему любимому AI и попросите изменить скрипт под ваши задачи. Может не заработать с первого раза, но обычно работает. Хотя бы попробуйте :)
Вот и всё!
Вы научились создавать простые твёрдые элементы, перемещать их и комбинировать с помощью булевых операций — или оставлять как есть. Также можно настраивать различные параметры, такие как наложение текстур или имена материалов. Теперь вы готовы создать что-то особенное!
Дополнительная Информация
Рендеринг
- Улучшаем реализм — как сделать сцены более реалистичными;
- Освещение — управление окружением и направленным светом;
- Насыщенные отражения — как делать "сочные" отражения;
- Отражение в полу — эффект размытого отражения сцены в полу;
- Менеджер заданий — как отрендерить много и попозже.
- Рендеринг на GPU — как рендерить сцены быстрее;
- Длительность и качество рендеринга — учимся контролировать продолжительность рендеринга;
- Простое или реалистичное освещение — ускоряем рендеринг.
Материалы
- Текстурные слоты — использование текстурных слотов в Boxshot;
- Стеклянные материалы — об отражении и преломлении света;
- УФ-лакирование — добавляем эффект УФ-лака по маске;
- Фольгирование — добавляем поверхности блеска;
- Рельеф — добавляем неровности материалу;
- Копирование материалов — копируем материалы между объектами;
- Собственные материалы — расширяем стандартную библиотеку;
- Полупрозрачные этикетки — добавляем прозрачности;
- Материалы Boxshot — подробная информация о материалах Boxshot.
Возможности
- Булевы операции — объединяем и вычитаем объекты, делаем дырки;
- Наклейки — нанесение наклеек/декалей на объекты;
- Рельефные наклейки — добавляем локальный рельеф;
- Глубина резкости — добавляем реализма изображениям;
- Инструменты — информация об инструментах Boxshot;
- Управление изображениями — внешние ресурсы проекта;
- Экземпляры — легковесные копии объектов сцены;
- Редактор моделей — редактирование вложенных моделей;
- Термоусадочная плёнка — симуляция термоусадки для оборачивания объектов;
- Физическая симуляция — применение гравитации к сцене;
- Паллетирование — расстановка объектов сцены на паллете;
- Снимки — сохранение состояния сцены для повторного использования;
- Локализация — учим Boxshot говорить на вашем языке;
- Векторные изображения — как сохранить качество векторных изображений.
Объекты
- Объекты Lathe — создание симметричных объектов вращением кривых;
- Объекты Loft — создание произвольных объектов из 2D-сечений;
- 3D-текст — создание трёхмерных текстовых объектов в Boxshot;
- Выдавленные объекты — как сделать объёмный 3D-объект из плоской 2D-кривой;
- Конические этикетки — создание конических этикеток с искажённым дизайном;
- Коробка по развёртке — очень реалистичная коробка на основе развёртки;
- Собственные фигуры — добавление собственных фигур на левую панель;
- Твёрдые тела — создание фигур, пригодных для булевых операций;
- Скриптовые твёрдые тела — создание сложных твёрдых тел с помощью кода;
- Сторонние фигуры — импорт сторонних фигур в Boxshot.