我似乎搜索了整个互联网,试图找到一个检查3d point
是否在(origin
,length
,{{1}定义的椭圆锥内的实现},horizontal angle
)。不幸的是没有成功,因为我只是真的找到one math solution我不明白。
现在我知道如何使用普通锥体来实现它:
vertical angle
然而,高度检测太高了。我真的想为一个游戏实现一个更逼真的人工智能视觉锥,但这要求锥形的形状更像人类的视野,而不是高。
非常感谢您的帮助:)
答案 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。
以下是要采取的步骤:
建立一个坐标系,其原点位于基础 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
使用
将您的点E=[i,j,k]
转换为本地坐标
P=(x,y,z)
现在确定锥体轴线与P2 = transpose(E)*(P-B) = (x2,y2,z2)
的距离,其中s=(h-z2)/h
位于尖端,s=0
位于底部。
如果s=1
或s>1
那么该点就在了
否则,如果s<0
您需要检查s>0
是否在内。
如果(x2/(s*a))^2+(y2/(s*b))^2<=1
,请检查s=0
和x2=0
是否正好在该位置。
如果你不能做基本的矢量代数,比如交叉产品,3D变换和规范化,我建议你先做一些阅读,然后才能理解这里发生了什么。
注意:
y2=0