在观看flustum中查找所有大小L的所有立方体的方法



我正在尝试查找或搜索一种方法,该方法很快找到了通过查看flustum所包含的所有大小L。甚至使用cuda。

我已经制作了用于射线播放的DDA遍历,这对我来说就像是1D案例,而且很简单,因为我只以已知距离沿线移动。

我的本能是创建一个圆环的边界盒,然后将该空间细分为大小L多维数据集的空间网格。然后测试每个单元格网格中的中心,以便在冰丝内部。考虑到Frustum是一种金字塔,似乎大约有一半的单元将被一个边界盒占据,我觉得这种方法只是在做太多的工作。不过,它肯定会起作用,我希望采用较小或更快的几何方法。

也许雷首先将左墙铸造出来,然后右墙第二,然后在这些之间施放?简而

检测顶点是否驻留在frustum中的最快方法。Flustum由4架飞机组成,即顶部,底部,左,右和两个Z值,前后剪辑。对于每个顶点,请检查两件事:首先,它是前还是后面板外面或后面板?如果不是,它是在四个飞机内吗?

  1. 要检查顶点是在前面还是后面板外部或后面面板外部,请检查vertex.z对您的挫败:

    isInsideZ = vertex.Z >= frustrum.Zmin && vertex.Z <= frustrum.Zmax;
    
  2. 要检查它是否在四个挫折"墙壁"内部,您需要为它们计算它们的交叉向量,以朝向击败的中心。然后,将每个横向矢量的点产物和位置向量的点相对于各自平面。您可以通过从您测试的顶点中减去平面上的某个任意点来获得此位置向量。如果点产物为正,则该平面的顶点在上方。

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

    其中 planeloc[i]位于相应平面上的任何点 i

如果满足所有条件,则顶点在挫折中:

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

这听起来有些尴尬,但是可以在磨循环之外完成很多事情,例如计算跨产品,即iffsum Plane Formals或平面位置向量。例如,如果平面由(1,0,0), (1,1,0)跨越,则(1,0,0)已经代表位于该平面上的一个点。

最新更新