【问题标题】:Find If a Ray Intersects a Voxel Without Marching查找光线是否与体素相交而不行进
【发布时间】:2015-10-22 21:11:53
【问题描述】:

我非常了解行进/DDA 算法,但我希望能够在恒定时间内进行每个体素射线对检查,而不必“行进”通过体素空间。我该怎么办?

为了清楚起见,我不是试图找到第一个体素射线相交,而是给定一条射线和一个体素,确定该体素的细胞是否甚至位于射线的路径内。

【问题讨论】:

  • 恐怕这是不可能的。体素是独立的,没有捷径可走。如果可以在不前进的情况下预测你降落在哪个体素上,那就意味着体素表示不合适。
  • 我很清楚,如果不进行行进,就不可能找到 first 相交的体素,这不是我想要做的。我只是想找出 a 体素是否与无限长的射线相交,假设没有任何东西可以阻挡射线。我意识到我的原始语言不清楚,所以我编辑了问题以更好地传达这种区别。

标签: algorithm geometry voxel


【解决方案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 &lt; 0,则必须反转不等式。如果Dx == 0,则不等式在x &lt; Ox &lt; x + 1中退化,可以直接判断。

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

例如,对于Dx, Dy, Dz &gt; 0,您必须拥有

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

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


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


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

(OC x D)² < R²

【讨论】:

    【解决方案2】:

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

    Arbitrary one

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

    【讨论】:

    • 我当然可以,尽管这些都适用于任何 AABB。在我的情况下,我有一个带有整数索引的统一网格的额外约束,我想相信有一个比从每个要测试的网格单元中构造一个 AABB 并将其提供给一个 AABB 算法更有效的选择。
    • 我不相信整数会带来一些好处。更重要的是 - 对给定的光线和网格进行可能的预先计算(如链接论文中的优化算法部分)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2011-01-04
    • 2018-01-13
    • 2011-10-27
    相关资源
    最近更新 更多