如何动态地将2个XNA精灵分开移动?

3
我有两个物品,让我们称它们为Obj1和Obj2...它们都有当前位置pos1和pos2..此外,它们还具有当前速度向量speed1和speed2...如何确保如果它们的距离越来越近(检查当前和下一个距离),它们将远离对方移动?
我有一个带符号角函数,可以给我两个向量之间的带符号角度..如何利用它来检查我应该旋转speed1和speed2多少,以使这些精灵彼此移开?
    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));
    }

我这样检查NEXT和CURRENT距离:

我这样检查NEXT和CURRENT距离:

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;
}

有什么想法吗?
2个回答

1

如果我理解正确,这是您的情况,您想要获取这两个绿色向量。

situation

红色向量很容易得到: redVect = pos1 - pos2。 redVect 和 greenVect2 将指向相同的方向,所以您唯一需要做的是将其缩放,使其长度与 speed2 相匹配: finalGreenVect2 = greenvect2.Normalize() * speed2.Length(虽然我不确定这个公式是否正确)。greenVect1 = -redVect 因此 finalGreenVect1 = greenVect1.Normalize() * speed1.Length。然后使用 speed1 = finalGreenVect1speed2 = finalGreenVect2。如果您喜欢平稳转弯,那么这种方法将给您带来即时转弯,但您可能需要旋转速度矢量:
angle = signedAngle(speed) + (signedAngle(greenVect) - signedAngle(speed)) * 0.5f;

o.5f 是旋转速度,您可以将其调整为任何需要的值。恐怕您必须创建一个旋转矩阵,然后使用此矩阵 Transform() 速度向量。
希望这能帮到您 ;)


非常感谢您的评论。我将不得不制定计划,并在此回复我的结果。谢谢BlackBear! - JML

1
如果物体A和B越来越接近,那么其中一个物体的组件(X或Y)是相反的。
在这种情况下,Bx与Ax相反,因此只需将Ax添加到物体B的速度向量中,将Bx添加到物体A的速度向量中。

enter image description here


非常感谢您的评论。我将需要整理一下,然后在这里回复我的结果。谢谢Blau! - JML

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接