判断点是否在片中
Determine if point is in frustum
我正在尝试找出确定一个点是否在截锥体内的最佳方法。我有一些工作,但不确定它是否太麻烦,也许有一种更优雅/更有效的方式我应该这样做。
假设我想知道点 'x' 是否在一个截头体内:
确定平截头体的 8 个点(4 个近点,4 个远点)的位置后,我将根据由其中三个点构成的三角形计算平截头体每个平面的法线。例如(如上图所示),对于右侧,我从三个点制作两个向量:
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 都为正,则它在平截头体内。
所以这似乎可行,但我只是想知道我这样做是否愚蠢。直到昨天我才知道 'cross product' 是什么意思,所以这对我来说都是全新的,我可能会做一些相当愚蠢的事情。
要调整您采用的方法,而不是完全改变它,您可以利用其中 2 对平面平行的事实。为那对平面只创建一个法线。您已经对其中一个平面的 "in front" 点进行了测试,但假设您知道平锥体的深度,则可以使用相同的距离来测试该点相对于另一个平行面的点。
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;
}
}
如果您有多个点要针对同一个视锥体进行测试,您会受益,因为您只计算一次视锥体深度(每对平行平面)。
我正在尝试找出确定一个点是否在截锥体内的最佳方法。我有一些工作,但不确定它是否太麻烦,也许有一种更优雅/更有效的方式我应该这样做。
假设我想知道点 'x' 是否在一个截头体内:
确定平截头体的 8 个点(4 个近点,4 个远点)的位置后,我将根据由其中三个点构成的三角形计算平截头体每个平面的法线。例如(如上图所示),对于右侧,我从三个点制作两个向量:
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 都为正,则它在平截头体内。
所以这似乎可行,但我只是想知道我这样做是否愚蠢。直到昨天我才知道 'cross product' 是什么意思,所以这对我来说都是全新的,我可能会做一些相当愚蠢的事情。
要调整您采用的方法,而不是完全改变它,您可以利用其中 2 对平面平行的事实。为那对平面只创建一个法线。您已经对其中一个平面的 "in front" 点进行了测试,但假设您知道平锥体的深度,则可以使用相同的距离来测试该点相对于另一个平行面的点。
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;
}
}
如果您有多个点要针对同一个视锥体进行测试,您会受益,因为您只计算一次视锥体深度(每对平行平面)。