3

我正在尝试将两个几何/网格(红色和蓝色)合并为一个独特的。但是在创建新几何并应用geometry.merge() 后,我发现所有内部顶点和面仍然存在(绿色区域)。

我想删除所有额外的信息,因为它会在渲染面上产生视觉故障,而且我无法正确计算合并体积。我需要像上一张图​​片一样的东西,一个只包含最小外部/外部的单个网格面和顶点,删除内部的。

在此处输入图像描述

我尝试应用 ThreeCSG 来减去网格,但我发现它在尝试加载大型模型时会不断崩溃。我也尝试应用 raycaster 来检测常见的人脸,但这对大型模型的性能也有很大影响。

ThreeCSG 是这里唯一的好选择吗?但由于我不能在每个模型上都使用它,我应该丢弃它。我想快速应用一些不太依赖于网格三角形数量的东西。

4

1 回答 1

6

如果您使用ThreeCSG布尔运算,您应该从一开始就尝试将您的对象定义为 BSP 树或节点。它将提供更精确的结果,它可能会帮助您在不崩溃浏览器的情况下让更大的几何图形工作。

我在这里做了一个小提琴,你可以明白我的意思。结果如下所示:

布尔运算的结果

  • 在左侧,您可以看到我们在操作中使用的形状(仅用于可视化)。
  • 中间的布尔结果是通过从THREE.PlaneGeometry转换为 BSP 的 a 中减去转换为 BSP 的 a创建的THREE.BoxGeometry
  • 右侧的布尔结果是通过从原生 BSP 盒对象中减去原生 BSP 平面创建的。

如您所见,中间结果有 5 个以上的顶点,这意味着更多的面(顶部、两侧和底部多出 1 个,对角线平面多出 2 个)。

如果您对此结果进行另一个布尔运算,您将获得更多的点和顶点。您的 BSP 树将呈指数增长......!


换句话说,您的 BSP 树会随着每个布尔运算而变大,使其变慢,并且最终也可能崩溃。
如果您想做大量布尔运算,请尝试制作原生 BSP 形状以获得更好的结果,而不是使用转换后的 three.js 几何图形进行布尔运算。

所以而不是:

myBSP = new ThreeBSP( geometry );

做:

var polygons = [
    // define your polygons using new ThreeBSP.Polygon( vertices )
];

var node = new ThreeBSP.Node(polygons);

myBSP = new ThreeBSP(node);

然后做你的布尔运算......

于 2016-02-12T10:12:29.527 回答