Answers:
使用二维叉积会更快。不涉及昂贵的触发功能。
b2Vec2 target( ... );
b2Vec2 heading( ... );
float cross = b2Cross( target, heading );
if( cross == -0.0f )
// turn around
if( cross == 0.0f )
// already traveling the right direction
if( cross < 0.0f)
// turn left
if( cross > 0.0f)
// turn right
如果仍然需要实际角度,建议使用atan2
。 atan2
将为您提供任何矢量的绝对角度。要获取矢量之间的相对角度,请计算它们的绝对角度并使用简单的减法。
b2Vec2 A(...);
b2Vec2 B(...);
float angle_A = std::atan2(A.y,A.x);
float angle_B = B.GetAngle(); // Box2D already figured this out for you.
float angle_from_A_to_B = angle_B-angle_A;
float angle_from_B_to_A = angle_A-angle_B;
arccos
。这样,您将仅使用一个触发功能,但仍具有实际角度。但是,我建议您不要进行此优化,直到您确定AI角度跟踪对游戏的性能产生显着影响。
if( cross == -0.0f )
vs if( cross == 0.0f )
支票看起来非常脆弱。
有一种简单的方法可以通过法线几何找到矢量的绝对角度。
例如向量V = 2i-3j;
x系数的绝对值= 2;
y系数的绝对值= 3;
角度= atan(2/3); [角度将在0到90之间]
基于象限的角度将被改变。
如果(x系数<0且y系数> 0),则angle = 180-angle;
如果(x系数<0且y系数<0),则angle = 180 + angle;
如果(x系数> 0且y系数<0),则angle = 360-angle;
如果(x系数> 0且y系数> 0),则angle =角度;
找到第一和第二矢量的角度后,只需从第二矢量减去第一矢量角度即可。然后,您将获得两个向量之间的绝对角度。
Mathf.DeltaAngle()
。