确定是否点在视锥(Determine if point is in frustum)

2019-09-28 03:35发布

我试图找出最好的方法来确定一个点是否是视锥内。 我有一些工作,但不能确定它是否是太麻烦了,也许有我应该做这更优雅/有效的方式。

假设我想找出是否点“X”是平截里面:

一旦我有截(4附近分,4个远点)的8点的位置,我基于从三个点的形成一个三角形的计算正常的平截头体的每个平面。 例如(如上面在图中),用于右侧,我从三个点的使两个向量:

Vector U = FBR - NBR
Vector V = FTR - NBR

然后我提出这两个矢量之间的叉积,确保缠绕顺序是正确的垂直于所述平截头体的内部被指向,在这种情况下V x U将给出正确的正常。

Right_normal = V x U

一旦我有正常的每架飞机,我然后检查点x是否在平面的前面或后面由X到平面的点之一绘制一个矢量:

Vector xNBR = x - NBR

然后,我做这个载体,正常和测试,答案是肯定的,确认点x是否是截头的那架飞机的正确侧之间的点积:

if ( xNBR . Right_normal < 0 )
{
    return false;
}
else continue testing x against other planes...

如果x为正的所有平面,那么它是视锥内。

所以这似乎工作,但我只是想知道我是否在一个愚蠢的方式这样做。 我甚至不知道什么是交叉产品“的含义,直到昨天,所以这一切都相当新的给我,我可能会做一些蠢话。

Answer 1:

为了适应你已经采取,而不是完全改变它的办法,你可以利用的事实,对飞机的2是平行的。 创建只有一个是对飞机的正常。 你已经拥有的点是“前面”的飞机之一,但是假设你知道的视锥的深度测试,你可以使用相同的距离,以测试对其他平行面点。

double distancePastFrontPlane = xNBR . Right_normal;
if (distancePastFrontPlane < 0 )
{
    // point is in front of front plane
    return false;
    if(distancePastFrontPlane > depthFaceRtoFaceL)
    {
        // point is behind back plane
        return false;
    }
}

如果你有多个点来测试针对相同的圆台,你可以受益,因为你只计算视锥深度一次(每对平行平面)。



文章来源: Determine if point is in frustum