c++ - 判断点是否在截锥体内

标签 c++ 3d unreal-engine4 frustum

我正在尝试找出确定一个点是否在截锥体内的最佳方法。我有一些工作,但不确定它是否太麻烦,也许我应该有一种更优雅/更有效的方法来做到这一点。

假设我想知道点“x”是否在截锥体内:

Frustum example

一旦我有了平截头体的 8 个点(4 个近点,4 个远点)的位置,我就根据这三个点组成的三角形来计算平截头体每个平面的法线。例如(如上图所示),对于右侧,我从其中的三个点创建两个 vector :

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

然后我在这两个 vector 之间进行叉积,确保缠绕顺序对于指向平截头体内的法线是正确的,在这种情况下,V x U 将给出正确的法线.

Right_normal = V x U

一旦我有了每个平面的法线,我就会通过绘制从 x 到平面点之一的 vector 来检查点 x 是在平面的前面还是后面:

Vector xNBR = x - NBR

然后我在这个 vector 和法线之间进行点积,并测试答案是否为正,确认点 x 是否是平截头体平面的正确一侧:

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

如果所有平面的 x 均为正,则它位于平截头体内部。

所以这似乎有效,但我只是想知道我是否以一种愚蠢的方式这样做。直到昨天我才知道“交叉产品”是什么意思,所以这对我来说相当新鲜,我可能做了一些相当愚蠢的事情。

最佳答案

为了适应您所采取的方法,而不是完全改变它,您可以利用两对平面平行的事实。为该对平面仅创建一个法线。您已经测试了某个平面“前面”的点,但假设您知道平截头体的深度,则可以使用相同的距离来测试该点与另一个平行面的关系。

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;
    }
}

如果您有多个点要针对同一平截头体进行测试,您会受益,因为您只需计算一次平截头体深度(每对平行平面)。

关于c++ - 判断点是否在截锥体内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41163030/

相关文章:

C++11 "overloaded lambda"带有可变参数模板和变量捕获

math - 为什么我的正交投影矩阵不起作用?

c++ - C++ 中的 3d 卷积

c++ - 拖动 3D 控制杆(基于方向和视角)

c++ - 如何移动 TArray 的内容

c++ - 使用 Cmake 编译库

c++ - 我怎么能给c++ vector赋值

c++ - 使用 Visual Studio C++ 20 导入公共(public)模块文件夹的最佳方法

c++ - 这个类定义中定义了什么

algorithm - 将 3D 矩阵中的数据与另一个矩阵聚类