![]() |
1
5
首先是反思。如果我正确地阅读了您的代码,vector2.reflect的第二个参数对于曲面来说是正常的。水平地面的法向为(0,1),速度为(4,-3)的球撞击它,然后以速度(4,3)飞走。对吗?如果这不正确,那么我们必须更改if语句的主体。(请注意,您可以通过设置basketnorm=-basenorm来保存一些循环。) 现在是物理学。如前所述,当两个球碰撞时,每个球都会反弹,就像撞上了与两个球相切的玻璃墙一样,这不现实。想象一下打台球:一个快速的红球击中一个静止的蓝球死点。红球会反弹并离开蓝球吗?不,蓝球被击落,红球失去了大部分速度(所有,在完美的情况下)。一个炮弹和一个高尔夫球,两个都以相同的速度运动,但方向相反,正面碰撞,怎么样?它们都会平等反弹吗?不,炮弹会继续,几乎没有注意到撞击,但是高尔夫球会反向飞走。 比它来的快 . 要理解这些碰撞,你必须理解动量(如果你想要的碰撞不是完全弹性的,比如当豆袋碰撞时,你也必须理解能量)。基础物理教科书将在第一章中对此进行介绍。如果您只想模拟这些东西,请使用质心框架: Vector2 CMVelocity = (basket.Mass*basket.Velocity + base.Mass*base.Velocity)/(basket.Mass + base.Mass); baseVelocity -= CMVelocity; baseVelocity = Vector2.Reflect(baseVelocity, baseNorm); baseVelocity += CMVelocity; basketVelocity -= CMVelocity; basketVelocity = Vector2.Reflect(basketVelocity, basketNorm); basketVelocity += CMVelocity; |
![]() |
2
1
一个圆在它的边上某一点的法向是从它的中心到那个点的方向。假设您在这里处理的是圆的碰撞,那么一种简单的“速记”方法可以解决这一问题,即在碰撞时(当圆接触时),以下条件成立: 设A为一个圆的中心,B为另一个圆的中心。圆A的法向为正火(B-A),圆B的法向为正火(A-B)。这是真的,因为它们接触的点总是与两个圆的中心共线。 |
![]() |
3
0
警告:我不认为这是完全正确的。物理是 不 我的专长。 运动对正常人没有影响。通常,法线只是表示方向的标准化(长度1)向量,通常是多边形在三维对象上面对的方向。 我想你要做的是找到两个圆之间的碰撞法向,是吗?如果是这样的话,球体的一个很酷的特性是,如果你找到它们中心之间的距离,你可以将其标准化,得到球体的法向。 什么 似乎 对于二维物理来说,正确的做法是,取一个球体的速度*质量(能量),然后将其乘以标准化向量,得到另一个球体。将结果加到目标球体的能量上,从原始球体的能量中减去它,然后分别除以质量,得到最终的速度。如果另一个球体正在移动,则反向执行相同的操作。当然,你可以从那里简化数学,但现在已经晚了,我不想这样做:) 如果两个球体都在移动,则对另一个球体重复该过程(尽管您可以简化该方程以获得更有效的数学)。 这只是纸巾数学的后面,但似乎给出了正确的结果。还有,嘿,我曾经自己推导过欧拉角,所以有时候我的餐巾纸背面的数学公式也会计算出来。 这也假设了完全弹性碰撞。 如果我错了,我会很高兴知道在哪里:) |