给定环境的体素化和具有顶点A,B和C的三角形,确定三角形“占据”或居住的哪些体素的最佳方法是什么?换句话说,我怎样才能枚举三角形的任何部分所在的所有体素?
答案 0 :(得分:5)
首先,您需要进行体素/三角交叉测试。
为实现这一目标,一种自然的方法是使用立方体六面的半平面在三角形上重复应用多边形裁剪算法(例如3D中的Sutherland-Hodgman)并检查之后还剩下什么。
图形宝石III中描述了一种更好的方法,Triangle-Cube Intersection,第236-239页(implementation可用)。
然后,您需要枚举与三角形相交的所有体素。
第一种可能的方法:
[xmin,xmax]x[ymin,ymax]x[zmin,zmax]
扫描体素以找出与三角形相交的体素:
x
[xmin, xmax]
y
[ymin, ymax]
z
[zmin, zmax]
检查体素(x, y, z)
是否与三角形相交
这可以通过以下几种方式进行优化:
for
循环中逐步计算。for
循环的范围。第二种方法:
答案 1 :(得分:0)
最好的方法是使用DDA进行栅格化,因为它将比任何盒中三角测试快几倍。栅格化是一种散射技术,因此它仅接触三角形表面上的体素。盒式测试是一种收集技术,因此它们要求每个体素检查哪些三角形与之接触。前者(散射)为O(n ^ 2),而后者(聚集)为O(n ^ 3)。
要对两者进行良好的CPU比较,请参见: https://github.com/ramakarl/voxelizer
此代码演示了Schwarz-Seidel和Akenine-Moller两种收集技术,以及一种基于边缘的2D DDA分散技术。