如何影响 2 个动画对象的 2 个角度?
How to influence 2 angles from 2 animated object?
您好,在此先感谢您的帮助
这是我的:
- 多个对象随机移动的二维计划。
- 每个对象都有一个位置 (x,y) 和一个整数方向(0 到 360)。
这是我想要实现的目标:
- 当 2 个物体变得很近时(假设距离 < 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;
如果有人能帮助我,给予一些解释或指出我的错误,我将不胜感激。
我无法在此站点或 google 中找到任何合适的答案,而且我对三角函数计算、角度、弧度和所有这些都很弱...
谢谢
更可靠的方法是尽量减少使用角度。
而不是角度使用速度分量 vx
和 vy
(注意 vx=v*cos(direction)
,类似于 vy
和 sin
)。
要比较方向相似性,计算方向向量的点积(按长度归一化)
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
的值根据对象之间的距离计算。
您好,在此先感谢您的帮助
这是我的:
- 多个对象随机移动的二维计划。
- 每个对象都有一个位置 (x,y) 和一个整数方向(0 到 360)。
这是我想要实现的目标:
- 当 2 个物体变得很近时(假设距离 < 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;
如果有人能帮助我,给予一些解释或指出我的错误,我将不胜感激。 我无法在此站点或 google 中找到任何合适的答案,而且我对三角函数计算、角度、弧度和所有这些都很弱...
谢谢
更可靠的方法是尽量减少使用角度。
而不是角度使用速度分量 vx
和 vy
(注意 vx=v*cos(direction)
,类似于 vy
和 sin
)。
要比较方向相似性,计算方向向量的点积(按长度归一化)
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
的值根据对象之间的距离计算。