我有一个物体,它面向一个特定的方向(例如)45度视野和极限视野范围.我已完成所有初始检查(四叉树节点和距离),但现在我需要检查特定对象是否在该视锥内(在这种情况下,如果我们可以看到它,则决定只跟随该对象).
除了从投放射线对每个度Direction - (FieldOfView / 2)
到Direction + (FieldOfView / 2)
(我这样做,在目前,这是可怕的),什么是该做的清晰视野检查的最佳方式?
我曾经在视频游戏行业工作,我可以说每帧都像arccos这样的触发功能并不理想.相反,您预先计算锥体角度的余弦:
float cos_angle = cos(PI/4); // 45 degrees, for example
然后,通过将该点与锥体的点积相比较,您可以快速检查每个帧是否落入该锥体内部.
vector test_point_vector = normalize(test_point_loc - cone_origin); float dot_product = dot(normalized_cone_vector, text_point_vector); bool inside_code = dot_product > cos_angle;
没有触发函数,只有一些乘法,除法和加法.大多数游戏引擎都具有针对向量的优化normalize()函数.
这是因为这个等式:
A · B = |A| * |B| * cos(?)
如果对矢量进行归一化(A - > An),则简化等式:
An · Bn = cos(?)
计算视图方向(理解为矢量)与从您开始并在对象处结束的矢量之间的角度.如果它属于FieldOfView/2,则可以查看该对象.
那个角度是:
arccos(scalarProduct(viewDirection, (object - you)) / (norm(viewDirection)*norm(object - you))).