3DCoat способен комбинировать меши, создавая модель, которая нужна тебе. Он поддерживает три операции:
Посмотрим, как это можно делать скриптами.
Создадим две сферы и покажем, что может 3DCoat. В каждой секции будет полный код примера, чтобы ты мог просто скопировать его и запустить.
Обрати внимание, что в результате ты получаешь полноценый меш с аккуратной сеткой. Чтобы увидеть это, переключиьс в скульпт-комнате 3DCoat в режим, где она видна (клавиша W
на клавиатуре или меню "Просмотр / Показать сетку").
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;
}
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;
}
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 она тоже есть.