当前位置: 首页 > 知识库问答 >
问题:

二维圆碰撞后的方向计算

钮长恨
2023-03-14
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

我确实知道AABBs,但我现在只使用大约10个粒子,AABB现在不是必需的。

共有1个答案

昝成弘
2023-03-14

你知道,两个圆盘之间传递的力,对于这次碰撞,要沿着“法向矢量”走,这很容易得到--它只是沿着连接两个圆盘中心的线的矢量。

你有四个约束:动量守恒(因为它在x和y中适用,所以有两个约束),能量守恒,和这个“沿法线的力”约束。你有四个未知数,即最终速度的x和y分量。四个方程式和四个未知数,你可以解出你的答案。由于我的物理背景,我用动量而不是速度来写这篇文章,但希望这篇文章不会太难解析。(注意,例如,动能等于p**2/2m1/2mv**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不支持它。)

 类似资料:
  • 我正在编写软件,扩展圆-矩形碰撞检测(交集),以包括对碰撞的响应。圆边和圆矩形是相当直接的。但一圈又一圈地把我难住了。 例如,在离散事件模拟中,让两个圆碰撞,一个红一个绿。我们可能会出现以下情况: 在它们碰撞后,我们可以立即: 这里的RIP和GIP是在前一个时钟滴答的圆圈的位置。在当前时钟滴答时,在RDP和GDP处检测到冲突。然而,当两个圆位于RCP和GCP时,碰撞发生在时钟滴答之间。在时钟滴答声

  • 有没有数学方法可以求出两个圆圈碰撞所需要的时间?如果我能得到那个时间值,我就能把圆圈移动到那个时候的位置,然后在那个点上碰撞它们。 编辑:等速

  • 我有一个问题,碰撞检测一个圆和一个矩形。我曾尝试用勾股定理来解决这个问题。但所有查询都不起作用。矩形与圆的矩形包围盒发生碰撞。

  • 那么,我如何实现圆弧线的冲突检测呢?我必须使用Box 2d碰撞,还是可以使用矩形之类的其他方法? 顺便说一句,我讨厌box2d,因为我不了解其中的大部分内容,所以如果有一个解决方案排除box2d的话,我会非常感激。 黄色的弧线继续在黑色的圆圈上旋转。我如何在这里实现碰撞检测? 请帮忙!谢谢!

  • 为了计算x和y速度,我求解了一个动量守恒和动能守恒方程组。 顺便说一下,这些方程没有考虑圆的“形状”。 所以我通过求两个圆相交的切线来计算回弹角。 现在我有两个不同的最终速度方向:一个是用动量定律计算的,一个是用回弹计算的。 我不知道怎么把两种速度结合起来才能得到最后一种

  • 编辑:我刚刚删除了其他的方法,我们已经验证是正确的,因为问题似乎有点长,这些方法似乎是无关的。 我有一个circle类,它有以下属性:中心、半径、旧位置、加速度、质量和恢复。 如果你接受向量方法的表面价值是正确的,这会有帮助,我认为它们的命名足够好,让你弄清楚它们的作用,但我也可以把它们粘贴进去。 我的主要问题是,当我运行它时,它注册了一个碰撞发生了,但是第二个圆圈的值位置没有改变。我将如何解决这