我正在尝试找出确定一个点是否在截锥体内的最佳方法。我有一些工作,但不确定它是否太麻烦,也许有一种更优雅/更有效的方式我应该这样做。
假设我想知道点“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 对于所有平面都是正数,则它在截锥体内。
所以这似乎可行,但我只是想知道我是否以愚蠢的方式这样做。直到昨天我才知道“交叉产品”是什么意思,所以这对我来说是全新的,我可能正在做一些相当愚蠢的事情。