Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定点是否位于平截头体中_C++_3d_Unreal Engine4_Frustum - Fatal编程技术网

C++ 确定点是否位于平截头体中

C++ 确定点是否位于平截头体中,c++,3d,unreal-engine4,frustum,C++,3d,Unreal Engine4,Frustum,我正试图找出确定点是否在平截头体内部的最佳方法。我有一些工作,但不确定它是否太麻烦,也许有一种更优雅/有效的方式我应该这样做 假设我想知道点“x”是否在平锥中: if ( xNBR . Right_normal < 0 ) { return false; } else continue testing x against other planes... 一旦我得到了平截头体的8个点(4个近点,4个远点)的位置,我将根据其中三个点组成的三角形计算平截头体每个平面的法线。例如(如上

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

假设我想知道点“x”是否在平锥中:

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

一旦我得到了平截头体的8个点(4个近点,4个远点)的位置,我将根据其中三个点组成的三角形计算平截头体每个平面的法线。例如(如上图所示),对于右侧,我从三个点生成两个向量:

Vector U = FBR - NBR
Vector V = FTR - NBR
然后我在这两个向量之间做叉积,确保缠绕顺序正确,法线指向平截头体内部,在这种情况下,
vxu
将给出正确的法线

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...
if(xNBR.Right\u normal<0)
{
返回false;
}
否则继续对其他飞机测试x。。。
如果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;
    }
}
双距离PastFrontPlane=xNBR。右室正常;
如果(距离PastFrontPlane<0)
{
//点位于前平面的前面
返回false;
if(距离PastFrontPlane>深度FacerToFaceL)
{
//点在后平面后面
返回false;
}
}

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

“我有些东西在工作”,然后您要做的就是在代码审阅论坛上发布。啊,好的!我不知道那个论坛。谢谢也许这个被接受的答案会有帮助:这里有一个链接,链接到一个网站,该网站有基于他们的书面书籍的文档,由Eberly提供3D图形渲染,它有很多有用的技术。这应该给你一些帮助,作为一个伟大的资源。因为这是一个UE4问题,这可能会有帮助: