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 она тоже есть.

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