查找光线是否在没有行进的情况下相交体素

时间:2015-10-22 21:11:53

标签: algorithm geometry voxel

我非常了解行进/ DDA算法,但我希望能够在恒定的时间内进行每体素射线对检查,而不必进行游行和#34;通过体素空间。我该怎么做呢?

要清楚,我并不是要找到光线相交的第一个体素,而是给定光线和体素,确定该体素的细胞是否位于雷的路径。

2 个答案:

答案 0 :(得分:1)

光线为P = O + t D,其中POD为向量,t为正数。如果下面的系统有解决方案,则与体素[x,y,z]x[x+1,y+1,z+1]存在交集:

x < Ox + t Dx < x + 1
y < Oy + t Dy < y + 1
z < Oz + t Dz < z + 1
0 < t

我们为了简洁而重写(使用x' = (x - Ox) / Dx ...)

x' < t < x"
y' < t < y"
z' < t < z"
 0 < t

如果Dx < 0,必须颠倒不平等。如果Dx == 0,则x < Ox < x + 1中的不等式退化,可以直接决定。

对所有三个轴重复相同的讨论,并检查所有支架是否兼容。

例如,对于Dx, Dy, Dz > 0,您必须

max(0, x', y', z') < min(x", y", z").

有27个符号组合被考虑,在三个级联三向比较中分开。

作为微优化,您可以通过Dx Dy Dz重新调整最后一个不等式,并简化,以交换(更快)乘法的除法。

如果许多光线错过了体素,您可以通过使用边界球来加快处理速度。假设体素中心为C,体素半径R和向量D被归一化,则预测试为

(OC x D)² < R²

答案 1 :(得分:0)

您可以使用任何Ray Box(AABB)交点算法。

Arbitrary one

如果需要交叉点坐标,请选择3D线裁剪算法