C# 碰撞编程 - Momentum

标签 c# xna collision-detection xna-4.0

我正在编写一个 3D XNA 游戏,我正在努力了解如何在我的两个玩家之间实现类似动量的碰撞。基本上,这个概念是让任何一名玩家击中另一名玩家并试图将对手击倒(如任天堂明星大乱斗游戏)以得分。

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

如您所见,我所做的只是检查玩家 1 的边界球,当它与玩家 2 的边界球相交时,玩家 2 将在 Z 轴上向后推,现在显然这行不通而且不是很直观并且是我的问题所在,因为我正在努力想出如何提出解决方案,我想要发生的是当任何一个玩家与另一个玩家发生碰撞时,他们基本上交换矢量,从而产生我正在寻找的弹跳效果不仅影响一个轴,还影响 X 和 Z。

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

注意事项: PrimitiveSphere 如果您想知道正在使用(图形设备、球体直径、曲面分割)。

最佳答案

基本上,在您尝试进行的碰撞中,您需要弹性碰撞,其中动能和动量都守恒。所有动量 (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 的信息的原因是,如果您想要非正面碰撞或不同的质量,您应该能够将其合并。如果质量不相同,则速度不会简单地改变大小和方向。将涉及更多的数学。我希望这会有所帮助。

关于C# 碰撞编程 - Momentum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22613931/

相关文章:

c# - 基于另一个组合框的所选项目绑定(bind)组合框 - MVVM WPF

c# - 如何从另一个集合中生成游戏实体集合而不产生垃圾?

c# - 如何在 XNA 中最大化窗口

Android:如何检测两个圆之间的碰撞

python - 如何找到最近的可能的开放位置进行 pygame 碰撞检测?

javascript - 具有重力的2D碰撞检测-JavaScript

c# - 实时遥测不适用于 Azure Function .NET Core 6

没有方法重载的 c# 多态性(对于 web 方法)

c# - 不删除事件处理程序会导致 .Net 出现问题吗?

xna - 如何在 MonoGame 中获取底层 Window?