Динамическое обрезание или операции CSG в Three.js
Я ознакомился с примерами отсечения на сайте Threejs и операциями ThreeCSG, но я не могу найти пример, в котором есть "оба".
Чтобы быть более точным, мне требуется PlaneGeometry из PlaneBufferGeometry, который применяет операцию CSG так же плавно, как вырезание, но эта PlaneGeometry может перемещаться, изменяя свою позицию и ориентацию.
Например, сфера и плоскость находятся на сцене, плоскость начинает ориентироваться в Z и вращается в Y, постоянно обрезая одну сторону сферы, но плоскостью может быть коробка или любой другой объект.
Является ли это возможным?
1 ответ
Давайте посмотрим на две отдельные проблемы.
Для Plane Clipping все довольно легко сделать.
// plane in Z Direction
var plane = new THREE.Plane( new THREE.Vector3( 0, 0, 1), 1);
// tell the renderer to use it for clipping
renderer.clippingPlanes = [ plane ];
// enable clipping in the renderer
renderer.localClippingEnabled = true;
// create a new PhongMaterial
var material = new THREE.MeshPhongMaterial( {
side: THREE.DoubleSide, // to be able to look inside
clippingPlanes: [ plane ], // the clipping plane
clipShadows: true // also clip shadows
} ),
Как вы можете видеть здесь.
Обратите внимание, что clippingPlanes
являются массивом, чтобы вы могли предоставить более одного за раз.
Как вы можете видеть здесь.
Основное различие между отсечкой и CSG заключается в том, что во время отсечения новая геометрия не создается, поскольку она только проверяет, должен ли треугольник отображаться или нет.
Для CSG все по-другому, поскольку он создает новую геометрию для каждой операции.
Думайте о CSG как NewObject = ObjectA - ObjectB
,
Это гораздо более сложный алгоритм работы, который может быть недоступен в реальном времени, в зависимости от сложности ваших объектов.
Таким образом, было бы возможно объединить CSG и затем использовать плоскости отсечения в результирующем объекте.