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

问题描述

您好,谢谢您的帮助

这是我所拥有的:

  • 多个物体随机运动的2D计划。
  • 每个对象都有一个位置(x,y)和一个整数方向(0到360)。

这是我想要实现的目标:

  1. 当2个对象接近时(假设距离
  2. 当它们变得有点远时(距离40到60像素),我想改变它们的方向,以便它们变得更近。
  3. 在20到40岁之间,他们彼此跟随(但是我很容易做到这一点)
  4. 如果距离> 60像素,它们只会彼此忽略(这部分也已经可以)

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

  • 要比较两个角度(在简单情况下可以,但是如果一个物镜角度为359,另一个物镜角度为2,虽然找不到359-2 = 357,但我找不到一种计算其实际方向接近的好方法
  • 对两个对象应用较小的变化,以使它们看起来相互影响。 只需注意:如果两个物体的方向极端不同,则它们可以彼此忽略。

例如,当前我在物体太近(距离

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

当对象在20至60像素之间时

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的值对应于对象之间的距离进行计算。