我花了三个星期来修bug,onestly说,我已经不知道我的原始布尔核还剩下多少部分了。最终,我决定放弃精确的算术:XGeo谓词、面排列、通用回旋数分类。它很漂亮,单次切割就能给出正确答案。但是,当我开始通过NativeDetail回路geometry时,它就崩溃了。我的NativeDetail以float32存储位置,而这就成了问题。内核可以内部计算任意精度,但它必须以float写出结果,并且这个输出将成为下一个操作的输入。因此,我计算出的精确交点会在写出时被四舍五入。到下一个切割时,这个面就不再与其邻居对齐,并且两个面会开始相互穿透。链条中的每个操作都将在链条上堆叠另一个自相交的层。然后我尝试从内核内部修复它。我开始分类A×A对,而不仅仅是A×B,以便在输入中捕获自相交。然后我添加了一个解决它们的过滤器,最后添加了一个精确验证的快照清理。每个过滤器都是对内核的额外负担,它越来越慢。代码变得越来越难看。最终,我建立了更严格的测试,1000+切割,连续进行,然后开始捕获真正的失败。步骤187的非多面体。你修复它,结果跳到250多个。修复它,它又跳回58。花了大约一周的晚上才我终于承认:这不起作用了。并且布尔运算只占了我的路线图的不到5%之一,我想建立一百多个节点来创建节点编辑器。作为一个单独的开发者,我可以扔掉一个月的时间然后重新开始。所以我就是这样做的。 我不能放弃float内我的网格,并且我不想做到这一点。目标是实时的,实时图形和程序化建模的网格。所以我去找了一个在网格内保留float的人,并且通过其他方式解决了这些问题的人。新的内核基于Manifold的方法。同时,我也缩小了域:它只在多面体上工作,不尝试修复脏的输入。这样做的结果是内核变得更简单、更可预测,速度比旧内核快了大约一百倍。一些机制直接从Manifold中移植过来,然后我自己建立了新的东西:n-gon重建在输出上,以及从两个操作数传递属性通过证据。操作集也扩展了。除了并集、交集和减法之外,现在还有非破坏性切割(Seam)、切除表面以切除实体(Trim)和分裂成标记的片段(Shatter)。开放几何学,如盒子切割网格,成为首类输入,类似于SideFX在Houdini中的实现,只是现在更简单。