3DCoatScripting  4.8.31β
С помощью скриптинга можно управлять возможностями Коута и расширять его функционал.
🌀 Булевы операции над мешами

3DCoat способен комбинировать меши, создавая модель, которая нужна тебе. Он поддерживает три операции:

  1. Объединение
  2. Вычитание
  3. Пересечение

Посмотрим, как это можно делать скриптами.

Создадим две сферы и покажем, что может 3DCoat. В каждой секции будет полный код примера, чтобы ты мог просто скопировать его и запустить.

Обрати внимание, что в результате ты получаешь полноценый меш с аккуратной сеткой. Чтобы увидеть это, переключиьс в скульпт-комнате 3DCoat в режим, где она видна (клавиша W на клавиатуре или меню "Просмотр / Показать сетку").

Объединение (Add)

void main() {
// подготавливаем сцену
SculptRoom room;
room.clear().toSurface();
// создаём две сферы рядом так, чтобы
// они перекрывали друг друга
Builder builder;
Mesh a = builder.sphere()
.radius( 70 )
.details( 0.1 )
.build();
Mesh b = builder.sphere()
.radius( 40 )
.position( Vec3( 30, 40, 50 ) )
.details( 0.5 )
.build();
// объединяем меши
Mesh result = a | b;
// размещаем полученный меш на сцене
room += result;
}

Вычитание (Subtract)

void main() {
// подготавливаем сцену
SculptRoom room;
room.clear().toSurface();
// создаём две сферы разного размера рядом так,
// чтобы они перекрывали друг друга
Builder builder;
Mesh a = builder.sphere()
.radius( 70 )
.details( 0.1 )
.build();
Mesh b = builder.sphere()
.radius( 40 )
.position( Vec3( 30, 40, 50 ) )
.details( 0.5 )
.build();
// вычитаем меши
Mesh result = a - b;
// размещаем полученный меш на сцене
room += result;
}

Пересечение (Intersect)

void main() {
// подготавливаем сцену
SculptRoom room;
room.clear().toSurface();
// создаём две сферы разного размера рядом так,
// чтобы они перекрывали друг друга
Builder builder;
Mesh a = builder.sphere()
.radius( 70 )
.details( 0.1 )
.build();
Mesh b = builder.sphere()
.radius( 40 )
.position( Vec3( 30, 40, 50 ) )
.details( 0.5 )
.build();
// пересекаем меши
Mesh result = a & b;
// размещаем полученный меш на сцене
room += result;
}

Вместе

Т. к. ты, наверняка, захочешь написать что-то посложнее, чем одинокий меш на сцене, объединим все примеры булевых операций над мешами выше и разместим **все** полученные объекты на сцене.

Для этого понадобится знание о доступных в 3DCoat методах трансформации.

void main() {
// подготавливаем сцену
SculptRoom room;
room.clear().toSurface();
// создаём две сферы разного размера рядом так,
// чтобы они перекрывали друг друга
Builder builder;
Mesh a = builder.sphere()
.radius( 70 )
.details( 0.1 )
.build();
Mesh b = builder.sphere()
.radius( 40 )
.position( Vec3( 30, 40, 50 ) )
.details( 0.5 )
.build();
// выполняем булевы операции над мешами
// и помещаем результат на сцену
const Vec3 floorShift( 0, 200, 0 );
Mesh add = a | b;
Vec3 floor = Vec3( 0 );
add.tools().transform().position( floor ).run();
room += add;
Mesh subtract = a - b;
floor += floorShift;
subtract.tools().transform().position( floor ).run();
room += subtract;
Mesh intersect = a & b;
floor += floorShift;
intersect.tools().transform().position( floor ).run();
room += intersect;
}

В результате у тебя должна получиться "пирамидка" из сфер... Точнее, из того, что с ними стало после объединения, вычитания и пересечения.

Более сложный код уже может потребовать отладки. В скриптинге 3DCoat она тоже есть.

См. также
🌀 Как создать свой скрипт
🌀 Создание мешей из примитивов
🌀 Преобразование мешей
🌀 Отладка скриптов