【发布时间】:2014-03-05 12:00:04
【问题描述】:
给定环境的体素化和具有顶点 A、B 和 C 的三角形,确定三角形“占据”或驻留在哪些体素的最佳方法是什么?换句话说,我怎样才能枚举三角形的任何部分所在的所有体素?
【问题讨论】:
标签: graphics 3d geometry voxel
给定环境的体素化和具有顶点 A、B 和 C 的三角形,确定三角形“占据”或驻留在哪些体素的最佳方法是什么?换句话说,我怎样才能枚举三角形的任何部分所在的所有体素?
【问题讨论】:
标签: graphics 3d geometry voxel
首先,您需要一个体素/三角形相交测试。
要实现这一点,一种自然的方法是使用立方体六个面的半平面在三角形上重复应用多边形裁剪算法(例如 3D 中的 Sutherland-Hodgman)并检查什么是之后就离开了。
Graphics Gems III, Triangle-Cube Intersection, pp. 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 循环的范围可能会通过仅考虑与三角形的支撑平面相交的体素来减少。第二种可能的方法:
【讨论】:
[xmin,xmax]x[ymin,ymax]x[zmin,zmax] 的体素一起使用:对三角形应用平移,使立方体((xmin+xmax)/2,(ymin+ymax)/2,(zmin+zmax)/2) 的中心位于原点,然后对(xmax-xmin,ymax-ymin,zmax-zmin) 的三角形应用非均匀缩放,然后最后调用提供的实现(即不要更改代码,而是转换您的三角形)。
最好的方法是使用 DDA 进行光栅化,因为它比任何盒装三角形测试都要快几倍。光栅化是一种散射技术,所以它只触及三角形表面上的体素。盒子测试是收集技术,因此它们要求每个体素检查哪些三角形接触它。前者(分散)是O(n^2),后者是聚集,是O(n^3)。
有关两者的 CPU 比较,请参阅: https://github.com/ramakarl/voxelizer
此代码演示了两种聚集技术,Schwarz-Seidel 和 Akenine-Moller,以及一种散射技术,基于边缘的 2D DDA。
【讨论】: