乒乓球中的“逼真”碰撞

时间:2010-09-05 20:22:15

标签: c# math xna

我想用C#和XNA写一个乒乓球摩擦和反弹。我试图将碰撞实现为described by Garet Rees in a previous question

这是我用于乒乓的基本算法:

  1. 分隔碰撞的物体,使它们不再发生碰撞。
  2. 获取碰撞响应的曲面法线。
  3. 计算新的速度 - 这是我的问题。
  4. 以下是我目前用于碰撞响应的代码:

    Vector2 normalizedVelocity = Velocity;
    normalizedVelocity.Normalize();
    
    Vector2 u = -Velocity * Vector2.Dot(normalizedVelocity, normal);
    Vector2 w = Velocity - u;
    
    Velocity = w - u;
    

    出于测试目的,我认为没有摩擦和完美的弹性。这段代码适用于只在一个方向上移动的对象,例如:

    Velocity.X = 100;
    Velocity.Y = 0;
    

    Velocity.X = 0;
    Velocity.Y = 100;
    

    但是当我用对角线移动球进行测试时,例如:

    Velocity.X = 100;
    Velocity.Y = 40;
    

    结果速度不是我认为应该的速度。

2 个答案:

答案 0 :(得分:4)

我想你想做

Velocity = Velocity + 2 * normal * Vector2.Dot(Velocity, normal);

(其中normal是指向球碰撞的表面的 out 的标准化曲面法线)

而不是

Vector2 u = -Velocity * Vector2.Dot(normalizedVelocity, normal);
Vector2 w = Velocity - u;

Velocity = w - u;

因为力度* Vector2.Dot(...)具有与速度相同的方向,但是弹跳时球通常会改变方向......

如果你也想要摩擦,你必须模拟球的旋转,公式会变得更复杂。

答案 1 :(得分:1)

当与墙壁,窗户等碰撞时,你应该简单地反转x或y值(改变符号)。