【发布时间】:2017-10-17 01:57:29
【问题描述】:
我知道如何计算与 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 的屏幕上表示这些圆圈。
向量类:
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)
圆类:
class Particles():
def __init__(self,currentPos, oldPos, accel, dt,mass, center, radius):
self.currentPos = currentPos
self.oldPos = oldPos
self.accel = accel
self.dt = dt
self.mass = mass
self.center = center
self.radius = radius
def doVerletPosition(currentPos, oldPos, accel, dt):
a = currentPos.subtract(oldPos)
b = currentPos.add(a)
c = accel.scalarMult(dt)
d = c.scalarMult(dt)
return d.add(b)
def doVerletVelocity(currentPos, oldPos, dt):
deltaD = (currentPos.subtract(oldPos))
return deltaD.scalarMult(1/dt)
def collisionDetection(self, center, radius):
xCenter = (self.radius).xComponent()
yCenter = (self.radius).yComponent()
xOther = radius.xComponent()
yOther = radius.yComponent()
if ((xCenter - xOther)**2 + (yCenter-yOther)**2 < (self.radius + radius)**2):
return True
else:
return False
我确实知道 AABB,但我现在只使用大约 10 个粒子,而且现在不需要 AABB。
【问题讨论】:
-
听起来你想要做的是找到单位向量指向的方向。这是一个“弹性碰撞”,所以答案是同时应用动量守恒和能量守恒。
-
但是我该怎么做呢?
-
经过反思,我想你需要第三个约束,即冲量必须沿着连接两个圆盘中心的线,即碰撞的法线向量。如需更多帮助,请参阅physics.stackexchange.com/questions/79047/…。