2011-09-08 72 views
3

我有两个项目,我们可以称它们为Obj1和Obj2 ...两者都有当前位置pos1和pos2 ..此外,它们具有当前速度矢量speed1和speed2 ...如何确保它们的距离越来越近(检查当前和下一个距离),他们会离彼此更远吗?如何动态地将2个xna图片从彼此移开?

我有一个带符号的角度函数,它给了我两个向量之间的符号角度。我该如何利用它来检查我应该旋转多少速度1和速度2来移动那些来自彼此的精灵?

public float signedAngle(Vector2 v1, Vector2 v2) 
    { 
     float perpDot = v1.X * v2.Y - v1.Y * v2.X; 

     return (float)Math.Atan2(perpDot, Vector2.Dot(v1, v2)); 
    } 

我查了下和当前距离这样的:

float currentDistance = Vector2.Distance(s1.position, s2.position); 

Vector2 obj2_nextpos = s2.position + s2.speed + s2.drag; 
Vector2 obj1_nextpos = s1.position + s1.speed + s1.drag; 

Vector2 s2us = s2.speed; 
s2us.Normalize(); 
Vector2 s1us = s1.speed; 
s1us.Normalize(); 

float nextDistance = Vector2.Distance(obj1_nextpos , obj2_nextpos); 

然后根据他们是否正在变得更大或更小的我要他们搬走(无论是通过在同一方向上增加他们的当前速度或使他们进一步失败)...

if (nextDistance < currentDistance) 
{  
float angle = MathHelper.ToRadians(180)- signedAngle(s1us, s2us); 
s1.speed += Vector2.Transform(s1us, Matrix.CreateRotationZ(angle)) * esc; 
s2.speed += Vector2.Transform(s2us, Matrix.CreateRotationZ(angle)) * esc; 
} 

任何想法?

回答

1

如果对象A和B越来越近,其中一个对象组件(X或Y)相反。

在这种情况下Bx为相反斧

,所以只需要斧添加到对象B的速度矢量,和Bx到对象A

enter image description here

+0

非常感谢您的评论..将不得不制定这一点,并会在这里回复我的结果..感谢Blau! – JML

1

如果我理解正确,就是这种情况,你想获得两个绿色的向量。

situation

红色矢量很容易得到:redVect = pos1 - pos2。 redVect和greenVect2将指向相同的方向,所以唯一的步骤就是缩放它,以便它的长度与speed2的长度匹配:finalGreenVect2 = greenvect2.Normalize() * speed2.Length(尽管我对此公式不太确定)。 greenVect1 = -redVect so finalGreenVect1 = greenVect1.Normalize() * speed1.Length。然后speed1 = finalGreenVect1speed2 = finalGreenVect2。这种方法会给你瞬间导通,如果你喜欢一个平滑的转弯要通过旋转速度矢量:

angle = signedAngle(speed) + (signedAngle(greenVect) - signedAngle(speed)) * 0.5f; 

的o.5f是转速,调整到你需要的任何值。恐怕你必须创建一个旋转矩阵,然后用这个矩阵创建速度矢量Transform()
希望这有助于;)

+0

非常感谢您的意见的速度矢量。 。将必须制定这一点,并会在这里回复我的结果..感谢BlackBear! – JML