Скриптовые твёрдые тела

Boxshot поддерживает три типа твёрдых тел: простые, сложные и скриптовые.

Этот урок охватывает API для работы с твёрдыми телами в Boxshot.

Создание скриптового твёрдого тела

В Boxshot нет прямого способа создать скриптовое твёрдое тело. Нужно сначала создать простое или сложное твёрдое тело, затем преобразовать его в скриптовое. Создадим простой цилиндр и изучим доступные опции:

Простой твёрдый цилиндр в Boxshot

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

Преобразование простого твёрдого тела в скриптовое

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

Режим редактора скриптов твёрдых тел в Boxshot

Вы увидите две панели: левая отображает код, правая — предпросмотр фигуры. Здесь вы редактируете скрипт и видите обновлённую фигуру. Подробности — ниже; пока просто замените 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-наложения в редакторе вложенных моделей.

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

Это 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 и попросите изменить скрипт под ваши задачи. Может не заработать с первого раза, но обычно работает. Хотя бы попробуйте :)

Вот и всё!

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

Дополнительная Информация

Рендеринг

Материалы

Возможности

Объекты