如何影响 2 个动画对象的 2 个角度?

How to influence 2 angles from 2 animated object?

您好,在此先感谢您的帮助

这是我的:

这是我想要实现的目标:

  1. 当 2 个物体变得很近时(假设距离 < 20 像素),我想让它们的方向改变,使它们变得更远。
  2. 当它们变得有点远时(距离 40 到 60 像素),我想改变它们的方向,使它们变得更近。
  3. 在20到40之间他们互相跟随(但这部分我很容易做到)
  4. 如果距离 > 60 px,他们就会互相忽略(这部分已经可以了)

我在第 1 点和第 2 点遇到了一些困难:

例如,目前我在物体太近(距离 < 20)时这样做: self 是当前对象,b 是另一个相同类型的对象。

self.SetDirection( self.direction - ( b.direction - self.direction ));

当对象在 20-60px 之间时

self.SetDirection( direction + ( b.direction - self.direction ));

setdirection 方法(我知道它很丑,而且可能是错误的):

function TBoid.toAngle360(angle: double): double;
begin
  if angle < 0
  then angle := 360 - ( abs(round(angle)) mod 360 )
  else if angle > 360
       then angle := round(angle) mod 360;

  result := angle;
end;   

如果有人能帮助我,给予一些解释或指出我的错误,我将不胜感激。 我无法在此站点或 google 中找到任何合适的答案,而且我对三角函数计算、角度、弧度和所有这些都很弱...

谢谢

更可靠的方法是尽量减少使用角度。

而不是角度使用速度分量 vxvy(注意 vx=v*cos(direction),类似于 vysin)。

要比较方向相似性,计算方向向量的点积(按长度归一化)

dot = (vx1 * vx2 + vy1 * vy2) / (len1*len2)
where 
len1 = Hypot(vx1,vy1)

点积对共线向量为1,接近方向接近1,垂直向量为0,反共线向量为1(注意这相当于计算角差余弦)

要产生相互影响,请应用重力或库仑力之类的东西 - 物体对另一个物体产生力(因此产生加速度)。所以速度分量发生变化。

例如,您有几乎共线的向量,其分量 vx, vy。求法向量 N

nx = -vy
ny = vx

并将 N*coeff 加到一个速度上,将 -N*coeff 加到另一个速度上,使它们发散或收敛(取决于 coeff 的符号)。 coeff的值根据对象之间的距离计算。