2010-11-12 92 views
2

我一直在C#中编写一个简单的程序,其中一个 [X,Y]坐标是周期递增的。2D游戏物理矢量问题

我已经设法实现了一个碰撞检测方法,但我试图确定如何在一个角度反射球沿着相同的线性路径反弹回来。

dx = -dx //This bounces the ball back along the same linear path 
dy = -dy 

解决方案 三角

theta = range between 0<theta<=360 depending on where it bounced 
x = cos(theta)*time 
y= sin(theta)*time 

回答

9

牛顿物理学的整点是它是不是随机,它是确定性。如果您将相同的球以相同的角度以相同的速度和相同的旋转角度抛向同一墙壁,则每次都会到同一个地方。

这种程序对于编程和物理学都是一个非常好的学习机会。我鼓励你做的是先写一个模拟非常简单的弹跳的程序。正如你所注意到的,当一个物体直线向下移动并碰到一个水平面时,你可以将反弹建模为简单地反转垂直速度分量。只要做对了;没有引力,没有任何东西。这是一个很好的开始。

然后尝试以同样的方式添加水平墙壁的反弹。

然后尝试添加与水平或垂直方向对齐的而不是的墙壁反弹。这就是你将不得不学习矢量和三角函数如何工作的地方,因为你必须通过倾斜地撞击墙壁来计算球的速度变化。

然后添加重力。然后增加空气的摩擦力。然后添加球可以旋转的事实。增加弹性,以便您可以模拟球的变形。

一旦你达到那一点,如果你想引入随机性,你将能够弄清楚如何去做。例如,你可能会引入随机性,说:“当球撞击墙壁并变形时,我会引入一个随机元素,使其变形变化0-10%”。这将改变模拟如何反弹球。您可以尝试不同种类的随机性:例如,添加随机气流。

2

只要它是一个完美的表面不会反弹随机一个完美的球。矢量和三角都不会给你任何随机性。

+1

不!基本物理学不是随机的。你需要量子物理学。或者只是将你的参数(反射角)乘以一些随机系数。 ;) – AndreKR 2010-11-12 22:57:34

+2

虽然这是真的,但这并没有回答这个问题。 – 2010-11-12 23:09:19

3

你必须自己添加随机性。为了改变你的问题:“确定性地,它以角度θ反弹,我怎样才能让它在角度θ+ε上反弹,其中ε是一些随机值?”

要旋转矢量,请参见this。你只需指定theta。

伪代码:

RotateVector(vec): 
    bounce_vec = [-vec.x vec.y]; //deterministic answer is negative x, normal y 
    bounce_angle = acos(dot(vec,bounce_vec)/(norm(vec)*norm(bounce_vec))); 
    modified_angle = bounce_angle + random_number(); 
    ca = cos(modified_angle); 
    sa = sin(modified_angle); 
    rotation_matrix = [ca -sa; sa ca]; 
    return rotation_matrix * vec; 

3行使用law of cosines找出角度。在第4行中,该角度被随机修改。该函数的其余部分将以新角度旋转原始矢量。

0

“随机地,虽然适用于物理的基本定律”似乎是一种矛盾。然而...

如果你想让它在随机方向反弹,同时保持其当前速度,你可能会做这样的事情(伪):

  • 第一,超生规范的方式(dx = -dx或dy = -dy取决于碰撞)
  • 然后将dx和dy转换为极坐标(theta和r)
  • 抖动theta少量(+或 - 几度,根据你的口味)
  • 确保THETA没有标题到墙上的,你只是反弹
  • 转换THETA和r回到dx和dy

,这将是节约标势头。

+2

P.S.正如@Xodarap所说,您可以使用旋转矩阵,而不是转换为极坐标。不直观但更高效。 – LarsH 2010-11-12 23:04:48