我一直在使用C#中的一个简单程序,其中 Ball [X,Y]坐标是定期递增的。
我已经设法实现了一种碰撞检测方法,但我正在尝试确定如何以一个角度反射球,并选择沿相同的线性路径反弹。
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
答案 0 :(得分:9)
牛顿物理学的全部观点是不随机,它是 deterministic 。如果你以同样的角度以同样的速度和相同的旋转将同一个球扔在同一个墙上,它每次都会到达同一个地方。
这种程序对于编程和物理来说都是一个非常好的学习机会。我鼓励你做的是先写一个模拟非常简单的弹跳的程序。如您所知,当一个物体直接向下移动并撞击水平表面时,您可以将反弹建模为简单地反转垂直速度分量。只是做对了;没有引力,没有任何东西。这是一个很好的开始。
然后尝试以相同的方式从水平墙上添加弹跳。
然后尝试添加从不与水平或垂直方向对齐的墙壁弹跳。这就是你必须要学习矢量和三角学如何工作的地方,因为你必须通过倾斜地撞击墙壁来计算出球速度的哪个部分发生了变化。
然后加重力。然后从空气中添加摩擦力。然后添加球可以旋转的事实。增加弹性,使你可以模拟球的变形。
一旦你达到这一点,如果你想引入随机性,你将能够弄清楚如何去做。例如,您可以通过说“好吧,当球撞到墙壁并变形时引入随机性,我将引入一个随机元素,将其变形改变0-10%”。然后,这将改变模拟弹跳球的方式。您可以尝试不同类型的随机性:例如,添加随机气流。
答案 1 :(得分:3)
您必须自己添加随机性。重新解释一下你的问题:“确定性地,它以角度θ反弹。我怎样才能使它以角度θ+ epsilon反弹,其中epsilon是一个随机值?”
要旋转矢量,请参阅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行中,该角度是随机修改的。函数的其余部分以新的角度旋转原始矢量。
答案 2 :(得分:2)
只要它是具有完美表面的完美球,它就不会随机弹回。矢量和三角学都不会给你任何随机性。
答案 3 :(得分:0)
如果您希望它以随机方向反弹,同时保持其当前速度,您可能会执行以下操作(伪代码):
这将保留标量动力。