您好,提前感谢您的帮助
这是我所拥有的:
- 多个对象随机移动的 2D 平面图。
- 每个对象都有一个位置 (x,y) 和一个整数方向(0 到 360)。
这是我想要实现的目标:
- 当两个物体变得很近时(假设距离 < 20 像素),我想让它们的方向改变,以便它们变得更远。
- 当它们变得有点远(距离 40 到 60 像素)时,我想改变它们的方向,使它们变得更近。
- 在 20 岁到 40 岁之间,他们互相关注(但这部分我很容易做到)
- 如果距离> 60 px,他们就会互相忽略(这部分也已经没问题了)
对于第 1 点和第 2 点,我遇到了一些困难:
- 要比较两个角度(在简单情况下没问题,但如果一个物体角度为 359,另一个为 2,我找不到一种好方法来计算它们的实际方向接近,尽管 359 - 2 = 357。
- 对两个对象应用微小的变化,使它们看起来相互影响。 只是要注意:如果两个对象的方向截然不同,它们可以互相忽略。
例如,当前当物体太近(距离< 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;
如果有人可以帮助我,给出一些解释或指出我的错误,我将非常感激。 我在这个网站或谷歌上找不到任何合适的答案,而且我对三角计算、角度、弧度和所有这些都很弱......
谢谢
最佳答案
更可靠的方法是尽量减少使用角度。
使用速度分量 vx
和 vy
代替角度(请注意 vx=v*cos(direction)
,与 类似vy
和 sin
)。
要比较方向相似度,请计算方向向量的点积(按其长度归一化)
dot = (vx1 * vx2 + vy1 * vy2) / (len1*len2)
where
len1 = Hypot(vx1,vy1)
对于共线向量,点积的值为 1,对于接近的方向,点积的值为 0,对于垂直向量,点积的值为 0,对于反共线向量,点积的值为 1(注意,这相当于计算角度差余弦)。
要产生相互影响,请应用重力或库仑力之类的东西 - 物体对另一个物体产生力(因此是加速度)。因此速度分量会发生变化。
例如,您有几乎共线的向量,其分量为 vx, vy
。求法向量N
nx = -vy
ny = vx
并将 N*coeff
添加到一个速度,将 -N*coeff
添加到另一个速度,使它们发散或收敛(取决于 coeff< 的符号
)。 coeff
的值对应于物体之间的距离计算。
关于delphi - 如何影响 2 个动画对象的 2 个角度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64790608/