3D:椭圆锥内的检查点

时间:2014-08-01 12:10:17

标签: math 3d pseudocode

我似乎搜索了整个互联网,试图找到一个检查3d point是否在(originlength,{{1}定义的椭圆锥内的实现},horizontal angle)。不幸的是没有成功,因为我只是真的找到one math solution我不明白。

现在我知道如何使用普通锥体来实现它:

vertical angle

然而,高度检测太高了。我真的想为一个游戏实现一个更逼真的人工智能视觉锥,但这要求锥形的形状更像人类的视野,而不是高。

非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:3)

给定一个3D椭圆锥体,基部位于B=(x_B,y_B,z_B),高度h沿锥轴k=(k_x,k_y,j_z),主基半径a,次基半径{{1} }和沿着主轴b的方向,您需要找到点i=(i_x,i_y,i_z)是否位于锥体内。您可以选择如何对主轴方向进行参数化,我认为您正试图以两个角度使用spherical coordinates

以下是要采取的步骤:

  1. 建立一个坐标系,其原点位于基础 B 上,并且沿着主轴P=(x,y,z)具有本地 x 轴。本地 z 轴应朝向i的尖端。最后,本地 y 轴应为

    k 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=normalize(j)轮播矩阵由列3×3

  2. 定义
  3. 使用

    将您的点E=[i,j,k]转换为本地坐标

    P=(x,y,z)

  4. 现在确定锥体轴线与P2 = transpose(E)*(P-B) = (x2,y2,z2)的距离,其中s=(h-z2)/h位于尖端,s=0位于底部。

  5. 如果s=1s>1那么该点就在了

  6. 否则,如果s<0您需要检查s>0是否在内。

  7. 如果(x2/(s*a))^2+(y2/(s*b))^2<=1,请检查s=0x2=0是否正好在该位置。

  8. 如果你不能做基本的矢量代数,比如交叉产品,3D变换和规范化,我建议你先做一些阅读,然后才能理解这里发生了什么。

    注意:

    y2=0