问题描述
您好,谢谢您的帮助
这是我所拥有的:
这是我想要实现的目标:
- 当2个对象接近时(假设距离
- 当它们变得有点远时(距离40到60像素),我想改变它们的方向,以便它们变得更近。
- 在20到40岁之间,他们彼此跟随(但是我很容易做到这一点)
- 如果距离> 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上找不到任何合适的答案,而且我对三角计算,角度,弧度及其他所有功能都一无所知。
谢谢
解决方法
更可靠的方法是最小化使用角度。
使用速度分量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
的值对应于对象之间的距离进行计算。