在观察平截头体中找到大小为L的所有立方体的方法?

时间:2017-09-15 21:44:54

标签: algorithm

我正在尝试查找或搜索一种方法,该方法可以快速找到所有尺寸为L的立方体,这些立方体将包含在视锥体中。甚至可能使用cuda。

我已经对光线投射进行了DDA遍历,这对我来说就像一个简单的情况,因为我只是沿着已知距离的线移动。

我的直觉是创建截头体的边界框,并将此空间细分为大小为L立方体的空间网格。然后测试每个单元格的网格中心是否在平截头体内。考虑到视锥体是金字塔,似乎大约一半的细胞将被边界框占据,我觉得这种方法只是做了太多的工作。它肯定会起作用,我希望不那么天真或更快的几何方法。

也许射线首先投射左墙,然后右墙第二,然后在这些之间投射线?所以简而言之,寻找像DDA遍历这样的R3版本。

1 个答案:

答案 0 :(得分:0)

检测顶点是否位于平截头体内的最快方法是dot product。平截头体由4个平面组成,即顶部,底部,左侧,右侧和两个z值,前后剪裁。对于每个顶点检查两件事:首先,它是在前面板还是后面板外面?如果不是,它是在四个平面内吗?

  1. 要检查顶点是在前面板还是后面板之外,请检查vertex.Z对着您的截头体:

    isInsideZ = vertex.Z >= frustrum.Zmin && vertex.Z <= frustrum.Zmax;
    
  2. 要检查它是否位于四个截头“墙壁”内,您需要为它们计算cross vectors,朝向截头体的中心。然后检查每个交叉矢量的点积和相对于相应平面的顶点的位置矢量。通过从测试的顶点减去平面上的任意点,可以获得此位置矢量。如果点积为正,则顶点高于那个平面。

    isAbove[i] = Vector3D.Dot(cross[i], vertex - planeloc[i]) > 0;
    

    planeloc[i] 任何点位于相应的 i 上的

  3. 如果满足所有条件,则顶点位于截头体内:

    isInside = isInsideZ && isAbove[0] && isAbove[1] && isAbove[2] && isAbove[3];
    

    这听起来有点尴尬,但是在研磨循环之外可以做很多事情,例如计算交叉积,即截头平面法线,或平面位置矢量。例如,如果某个平面跨越(1,0,0), (1,1,0),则(1,0,0)已经代表该平面上的一个点。