我知道如何在与2个圆圈碰撞后计算速度矢量的标量 (根据此链接:https://gamedevelopment.tutsplus.com/tutorials/how-to-create-a-custom-2d-physics-engine-the-basics-and-impulse-resolution--gamedev-6331)
这些圆圈不能旋转,没有摩擦,但可以有不同的质量,但我似乎无法找到任何方法来找到我需要乘以速度标量的单位向量来获得粒子的新速度碰撞后。
我也知道如何检查2个圆圈是否发生碰撞。
另外,我只是在纯粹的“数学意义”中处理这个问题(即圆圈有一个中心和一个半径),并且想知道如何在python 3.0中在屏幕上表示这些圆圈。
矢量类:
doSomething()
圈子类:
class Vector():
def __init__(self,x,y):
self.x = x
self.y = y
def add(self, newVector):
return Vector(self.x+newVector.x, self.y+newVector.y)
def subtract(self,newVector):
return Vector(self.x-newVector.x, self.y-newVector.y)
def equals(self, newVector):
return Vector(newVector.x,newVector.y)
def scalarMult(self, scalar):
return Vector(self.x*scalar, self.y*scalar)
def dotProduct(self, newVector):
return (self.x*newVector.x)+(self.y*newVector.y
def distance(self):
return math.sqrt((self.x)**2 +(self.y)**2)
我确实知道AABB,但我现在只使用大约10个粒子,现在不需要AABB。
答案 0 :(得分:1)
你知道两个光盘之间传输的力必须沿着这个碰撞的“法向量”传递,这很容易得到 - 它只是沿着连接两个光盘中心的线的矢量。
你有四个约束条件:动量守恒(由于它适用于x和y,因此计算两个约束条件),能量守恒,以及“正常力”约束。而且你有四个未知数,即最终速度的x和y分量。 四个方程式和四个未知数,你可以解决你的答案。由于我在物理学方面的背景,我用动量而不是速度来写出来,但希望这不是很难解析。 (注意,例如,动能等于p**2/2m
或1/2 mv**2
。)
## conservation of momentum
p_1_x_i + p_2_x_i = p_1_x_f + p_2_x_f ## p_1_x_i := momentum of disc _1_ in _x_ axis intially _i
p_1_y_i + p_2_x_i = p_1_y_f + p_2_y_f
## conservation of energy
(p_1_x_i**2 + p_1_y_i**2)/(2*m_1) + (p_2_x_i**2 + p_2_y_i**2)/(2*m_2) = (p_1_x_f**2 + p_1_y_f**2)/(2*m_1) + (p_2_x_f**2 + p_2_y_f**2)/(2*m_2)
## impulse/force goes along the normal vector
tan(th) := (x_2-x_1)/(y_2-y_1) # tangent of the angle of the collision
j_1_x := p_1_x_i - p_1_x_f # change in momentum aka impulse
j_1_y := p_1_y_i - p_1_y_f
tan(th) = -j_1_x/j_1_y
(我希望这个符号很清楚。如果我可以使用latex,会更清楚,但stackoverflow不支持它。)
希望这有帮助!