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

圆周碰撞不准确

百里业
2023-03-14

编辑:我刚刚删除了其他的方法,我们已经验证是正确的,因为问题似乎有点长,这些方法似乎是无关的。

我有一个circle类,它有以下属性:中心、半径、旧位置、加速度、质量和恢复。

def doVerletPosition(self):
    diffPos = (self.center).subtract(self.oldPos)
    aggregatePos = diffPos.add(self.center)
    ATT = (self.accel).scalarMult(dt**2)
    e = ATT.add(aggregatePos)
    return e

def doVerletVelocity(self):
    deltaD = ((self.center).subtract(self.oldPos))
    return deltaD.scalarMult(1/dt)


def impulseScalar(self,other):                                                                           

    isCollision = self.collisionDetection(other)
    collisionNormal = isCollision[0]

    if(isCollision[1] == True):

        relativeVelocity = (other.doVerletVelocity()).subtract(self.doVerletVelocity())
        normDirecVel = relativeVelocity.dotProduct(collisionNormal)

        restitution = -1-(min(self.restitution,other.restitution))

        numerator = restitution * normDirecVel

        impulseScalar = numerator/(self.invMass + other.invMass)

        impulse = collisionNormal.scalarMult(impulseScalar)

        selfVel = (self.doVerletVelocity()) 
        otherVel = other.doVerletVelocity()

        selfVelDiff = impulse.scalarMult(self.invMass)
        otherVelDiff = impulse.scalarMult(other.invMass)

        selfVel = selfVel.subtract(selfVelDiff)
        otherVel = otherVel.subtract(otherVelDiff)

        self.oldPos = (self.center).subtract(selfVel)
        other.oldPos = (other.center).subtract(otherVel)

如果你接受向量方法的表面价值是正确的,这会有帮助,我认为它们的命名足够好,让你弄清楚它们的作用,但我也可以把它们粘贴进去。

我的主要问题是,当我运行它时,它注册了一个碰撞发生了,但是第二个圆圈的值位置没有改变。我将如何解决这个问题,因为似乎我正在正确地执行计算。

第一圈和第二圈的值为:

center = Vector(0,0)
radius = 3
oldPos = Vector(0,0)
accel = Vector(0,0)
mass = 1
restitution = 0.5

center2 = Vector(0,4.2)
radius2 = 1
oldPos2 = Vector(0,4.21)
accel2 = Vector(0,-1)
mass2 = 1
restitution2 = 0.7

返回的是这里:(它返回中心的位置)

0.0      0.0     0.0     4.1896
0.0      0.0     0.0     4.178800000000001
0.0      0.0     0.0     4.167600000000001
0.0      0.0     0.0     4.1560000000000015
0.0      0.0     0.0     4.144000000000002
0.0      0.0     0.0     4.131600000000002
0.0      0.0     0.0     4.118800000000003
0.0      0.0     0.0     4.1056000000000035
0.0      0.0     0.0     4.092000000000004
0.0      0.0     0.0     4.078000000000005
0.0      0.0     0.0     4.063600000000005
0.0      0.0     0.0     4.048800000000006
0.0      0.0     0.0     4.033600000000007
0.0      0.0     0.0     4.018000000000008
0.0      0.0     0.0     4.002000000000009
0.0      0.0     0.0     3.9856000000000096
INTERSECTION
0.0      0.0     0.0     3.9688000000000105
INTERSECTION
0.0      0.0     0.0     3.9516000000000115
INTERSECTION
0.0      0.0     0.0     3.9340000000000126

所以当它打印交点时,如果脉冲法是正确的,固定的圆肯定会改变位置,(就像它看起来的那样(就像它在那条链上所说的那样)。

即使我让它运行更久,静止的圆圈仍然不动。

共有1个答案

宦宏爽
2023-03-14

对带有负数的操作要小心。也许你正以一种你不想要的方式改变价值观。到处使用sqrt。

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

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

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

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

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

  • 在一个小行星游戏中,我在旋转精灵时尝试使用XNA进行2D碰撞检测时遇到了一些问题。在子弹击中小行星之前,碰撞一直在发生(看起来是从各个方向),当飞船撞上小行星时,碰撞也是不准确的。我使用一个矩阵来旋转飞船发射的子弹,然后是一个小行星的矩阵,并且在一个Xbox独立游戏论坛上使用了每像素碰撞检测样本。 这是我的子弹矩阵…原点和位置是子弹的矢量2属性 和小行星... 我是编程新手,在过去的几天里,我一直