对网格进行体素化基本上意味着能够确定某个点(x,y,z)是否位于网格内部或外部。
此处的网格只是一组原始三角形。在网格外部意味着从任何视点都不存在与网格相交的点(任何方向)。
对于表现良好,闭合,不相交的网格,这很容易:沿任何方向跟踪光线,如果交点的数量是奇数,则该点在内部。
但对于一个"坏"网眼,由开放部分组成,这很糟糕。例如,网格可以是两个立方体,通过打开的圆柱体连接到两个立方体中。
ZBuffer渲染为一个视点解决了这个问题。但问题在于任何观点。对我来说问题是明确定义的,但要解决的问题并不明显。
我正在寻找有关如何解决此问题的一些指示。必须有大量的研究。任何文件链接?或者我错过了如何思考问题的方法?
答案 0 :(得分:1)
如果网格上的所有表面都具有“侧面”,即它们具有正面和背面,则可能。
然后,为了确定一个点是否在网格中,您可以从任意方向的点跟踪一条光线,并保持这样的交叉点计数:
如果最终计数为正,或者该点恰好位于任何曲面上,则该点位于网格内。
您需要添加一个限制,即从网格外部看不到表面暴露的背面。这相当于说网格应该始终从所有外部视点正确渲染并打开背面剔除。
对于具有立方体和开放圆柱体的示例,要使立方体为实体,其表面应为单面(使其成为双面意味着定义具有无限薄壁的空心立方体)。
圆柱体的网格表面也必须是单面的,否则它也会有无限薄的墙壁,圆柱内部(不在立方体内)的点不会在网格内部。只要圆柱体的末端卡在立方体内部,限制就不会被打破,因为你永远看不到面部暴露的背面。
如果删除其中一个立方体,则不符合限制,此算法将失败。