C#碰撞编程 - 动量

时间:2014-03-24 15:38:55

标签: c# xna collision-detection xna-4.0

我正在编写一个3D XNA游戏,我很难理解如何在我的两个玩家之间实现类似动量的碰撞。基本上这个概念是让任何一个玩家击中对方并试图将对手击出对手(如Smash Bros游戏)以获得一分。

    //Declared Variables
    PrimitiveObject player1body;
    PrimitiveObject player2body;
    Vector3 player1vel = Vector3.Zero;
    Vector3 player2vel = Vector3.Zero;

    //Created in LoadContent()
    PrimitiveSphere player1 = new PrimitiveSphere(tgd, 70, 32);
    this.player1vel = new Vector3(0, 135, -120);

    this.player1body = new PrimitiveObject(player1);
    this.player1body.Translation = player1vel;
    this.player1body.Colour = Color.Blue;

    PrimitiveSphere player2 = new PrimitiveSphere(tgd, 70, 32);
    this.player2vel = new Vector3(0, 135, 120);

    this.player2body = new PrimitiveObject(player2);
    this.player2body.Translation = player2vel;
    this.player2body.Colour = Color.Red;

    //Update method code for collision
    this.player1vel.X = 0;
    this.player1vel.Y = 0;
    this.player1vel.Z = 0;

    this.player2vel.X = 0;
    this.player2vel.Y = 0;
    this.player2vel.Z = 0;

    if (player1body.BoundingSphere.Intersects(player2body.BoundingSphere))
    {
        this.player2vel.Z += 10;
    }

正如你所看到的,我正在做的就是检查Player1的边界球体,当它与Player 2相交时,然后玩家2将被推回到Z轴上,现在很明显这只是不起作用而且不是很直觉,是我的问题所在,因为我试图弄清楚如何提出解决方案,我想要发生的是当任何一个玩家与另一个玩家碰撞时他们基本上交换向量给它反弹效果我正在寻找并且不仅影响一个轴而且影响X和X轴。 ž。

感谢您花时间阅读,我将不胜感激任何人都能想到的解决方案。

注意: 如果你想知道正在使用PrimitiveSphere(图形设备,球体直径,细分)。

1 个答案:

答案 0 :(得分:1)

基本上,在你想要做的碰撞中,你想要一个弹性碰撞,其中动能和动量都得到保护。所有动量(P)是质量*速度,动能(K)是1/2 *质量*速度^ 2。在你的假设中,我假设一切都有相同的质量。如果是,K = 1/2 * v^2。所以,Kf = Ki,Pf = Pi。使用动能,交换玩家的速度幅度。只要碰撞正好(基于你的代码,我认为你很好),玩家就会交换方向。

所以你可以做一些简单的事情:

if (player1body.BoundingSphere.Intersects(player2body.BoundingSphere))
{
    Vector3 p1v = this.player1vel;
    this.player1vel = this.player2vel;
    this.player2vel = p1v;
}

这应该会产生一个相当逼真的碰撞。现在我之所以包含有关P和K的信息,是因为如果你想要碰撞或不同质量的非头部,你应该能够合并它。如果质量不相同,速度不会简单地改变幅度和方向。将涉及更多的数学。我希望这会有所帮助。