Math 3D:椭圆锥体内的检查点

Math 3D:椭圆锥体内的检查点,math,3d,pseudocode,Math,3d,Pseudocode,我似乎搜索了整个互联网,试图找到一种检查3d点是否在由(原点,长度,水平角,垂直角)定义的椭圆锥内的实现。不幸的是没有成功,因为我只是真正发现了我不理解的东西 现在我知道了如何使用法线圆锥体来实现它: inRange = magnitude(point - origin) <= length; heading = normalized(point - origin); return dot(forward, heading) >= cos(angle) && inRa

我似乎搜索了整个互联网,试图找到一种检查3d
点是否在由(
原点
长度
水平角
垂直角
)定义的椭圆锥内的实现。不幸的是没有成功,因为我只是真正发现了我不理解的东西

现在我知道了如何使用法线圆锥体来实现它:

inRange = magnitude(point - origin) <= length;
heading = normalized(point - origin);
return dot(forward, heading) >= cos(angle) && inRange;
inRange=幅值(点原点)=cos(角度)和&inRange;
然而,那里的高度检测太高了。我真的很想为游戏的AI实现一个更真实的视觉圆锥体,但这需要使圆锥体的形状更像人类的视野,更宽而不是更高


非常感谢您的帮助:)

给定一个三维椭圆锥,底面位于
B=(x_B,y_B,z_B)
,高度
h
沿锥轴
k=(k_x,k_y,j_z)
,大底半径
a
,小底半径
B
以及沿长轴的方向
i=(i_x,i_y,i_z)
您需要找到一个点=(x,y,z)
位于圆锥体内部。如何参数化长轴方向是您的选择,我认为您正在尝试使用两个角度

以下是要采取的步骤:

  • 建立一个坐标系,原点位于基础B上,局部x轴沿长轴
    i
    。局部z轴应沿
    k
    朝向尖端。最后,局部y轴应为

    j=cross(k,i)=(i_z*k_y-i_y*k_z,i_x*k_z-i_z*k_x,i_y*k_x-i_x*k_y)
    j=标准化(j)

    您的
    3×3
    旋转矩阵由
    E=[i,j,k]

  • 将点
    p=(x,y,z)
    转换为具有

    P2=转置(E)*(p-B)=(x2,y2,z2)

  • 现在用
    s=(h-z2)/h
    确定锥体轴线的距离,其中
    s=0
    位于尖端,
    s=1
    位于底部


  • 如果
    s>1
    s0
    您需要检查
    (x2/(s*a))^2+(y2/(s*b))^2您需要的是如何将圆锥体的定义转换为中所示的标准圆锥体坐标。然后您可以按照其解决方案进行操作。有关帮助信息,请参阅。您缺少圆锥体底面的主半径和次半径的参数。此外,不需要角度,因为您始终可以将点转换为坐标系,其中t圆锥体沿
    +z
    轴。您的水平角和垂直角是如何定义的?非常感谢到目前为止的帮助,水平角和垂直角是以圆锥体一半的弧度定义的。例如
    角度=弧度(90°)
    表示180°前向水平视野。我在您提到的数学交流网站上问了原始问题。您对问题和答案理解有困难吗?非常感谢,我将在接下来的几天内尝试解决此问题,并将您的答案标记为解决方案
    //                  | i_x i_y i_z |
    //  transpose(E) =  | j_x j_y j_z |
    //                  | k_x k_y k_z |