Three.js:如何使用平面将物体分成两部分?

Posted

技术标签:

【中文标题】Three.js:如何使用平面将物体分成两部分?【英文标题】:Three.js: how to use a plane to cut objects in 2 parts? 【发布时间】:2020-09-21 05:41:07 【问题描述】:

我有一个复杂的对象,即一个盒子,我想动态切割它。这个jsFiddle就是一个很简单的例子:jsFiddle

非常简单的平面

var plane = new THREE.Mesh( geometry, material3 );
plane.rotation.x =1.3; // -Math.PI / 2;
gui.add(plane.rotation, "x", 0.1, Math.PI / 2).name("angle");
gui.add(plane.position, "y", -1, 1).name("h");
scene.add( plane );

我想从我的对象中移除上部。就像用刀从苹果上切下一块。

飞机就是刀:在我的示例中,您可以使用 2 个控件来上下移动飞机或改变角度。

你能帮我隐藏对象中移除的部分吗?

【问题讨论】:

要开始,请参阅:threejs.org/examples/?q=clipping。 【参考方案1】:

你有两个选择:

    您可以使用clipping,就像上面提到的 WestLangley。 剪裁不会修改顶点几何,它只是视觉上的。 不具破坏性,因此非常适合制作动画或进行持续更新。 剪裁主要是用几个平面而不是复杂的几何图形来完成的。 您可以对Constructive Solid Geometry 使用布尔运算。 布尔值确实会影响可以导出的顶点几何图形。 操作具有“破坏性”,因此一旦完成就无法进行更新。 可以对复杂的几何图形执行布尔运算,只要它们是“流形的”。

布尔运算要求两个几何都为manifold geometries 才能工作。这意味着两个网格都必须是封闭的,没有开放的面。您不能使用无限薄的平面,因此您的 JSFiddle 中的示例不起作用。您需要给每一面增加一点厚度,例如使用宽度为 0.0001 的盒子而不是平面。

【讨论】:

谢谢@Marquizzo!我正在使用选项 1,它看起来很棒。我还有另一个问题,因为我的主要对象在被切断时似乎是“空的”。您知道是否有“填充”对象部分的选项或设置?

以上是关于Three.js:如何使用平面将物体分成两部分?的主要内容,如果未能解决你的问题,请参考以下文章

有一个容器分成两部分,一部分是空气,一部分是真空,中间用隔板隔开

THREE.js:计算物体上一点的世界空间位置

35three.js鼠标控制物体旋转缩放

半平面交

Three.js - 立方体和球体与平面奇怪地剪裁

three.js中一个物体绕另一个物体旋转要如何实现?