我显然是在引用这个问题,因为我已经计算出3D网格的体积并且完美无瑕地工作:How to calculate the volume of a 3D mesh object the surface of which is made up triangles
回顾一下,我有一个由三角形组成的网格,所有网格都按照正确的顺序排列,并且高于零。
由于这是发送到3d打印,我想计算打印需要多少支持量 。例如,红色卷:
此外,某些具有某些材质的打印机实际上可以打印一些最小倾斜的表面,这意味着不需要包含该表面下的体积。
我觉得我可以在曲面下生成卷并合并它们,但是当模型超过数百万个多边形时,我预计任何JavaScript引擎都会在这种努力下崩溃。
编辑:
作为参考,我想在上图中以红色计算音量。
请记住,网格可以有任何形状,没有任何限制(除了密封和没有重叠部分)
答案 0 :(得分:0)
重写的答案,第一次没有正确理解问题。
您的目标应该是将平面划分为多边形,使得在每个多边形上方存在恒定数量的表面,即在多边形内的每个点处,垂直光线将与相同数量的三角形相交。然后你可以简单地在“洞”和“实心”之间交替,并以这种方式总结洞。为了获得平面的这种划分,请查看网格的“垂直”部分。一方面,这包括实际上是垂直的三角形。另一方面,如果一个三角形的法线低于水平而另一个三角形的法线低于水平,则这也包括三角形之间的边缘。
所以我建议采用以下方法:
我没有任何现成的想法来处理你提到的略微倾斜的情景。看看上面发现的洞可能会有所帮助。您可以将它们组合在分区的边界上,然后一次调查它们,看它们是否可以制作得更小。
编辑:经过多次思考,我意识到,由于你只需要忽略最顶层,你也可以从不同的角度处理这个方面:按照高度递减的顺序迭代所有三角形(任何顶点,或三个顶点的sume,或者其他;如果网格本身不相交,则细节无关紧要)。在迭代时,保持对地面上某些区域已经低于某个三角形的2d概念。您可以将其表示为一组多边形,甚至可以表示为一组凸多边形。
对于每个三角形,如果它完全位于一个区域内,则必须对其进行计数。因此,将它与原点(即其决定因素)跨越的voume添加到累积的体积中。如果它完全在所有区域之外,请不要计算其体积,而是将其投影添加为新多边形。如果它部分位于区域内部且部分位于外部,则仅计算并添加外部零件的体积,并将投影添加到它相交的区域。如果它与多个区域相交,则只计算所有区域之外的部分,并考虑将区域连接成更大的区域以简化数据结构。