我想用C#和XNA写一个乒乓球摩擦和反弹。我试图将碰撞实现为described by Garet Rees in a previous question。
这是我用于乒乓的基本算法:
以下是我目前用于碰撞响应的代码:
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;
结果速度不是我认为应该的速度。
答案 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值(改变符号)。