2012-09-12 2 views
3

중력장에서 탄성 충돌을 다루는 데 심각한 문제가 있습니다. 나는 에너지 보존 법칙을 일관되게 구현하려고 노력했지만 잘못되었다, as shown in this video. 첫째, 두 개의 물체가 서로 달라 붙고, 충돌 후 수백 프레임이 지나면 엄청난 속도에 도달합니다.파이썬/파이 게임에서 탄성 충돌

complete code is online here

있지만, 충돌 후 출력 속도를 제공 할 책임이 방법은 world.py에서이 기능입니다 :

def collision(self, obj1, obj2): 
    R = obj1.radius + obj2.radius # code is used to "jump back in time" to avoid penetration when there's a collision 
    dx = obj1.x - obj2.x   # 
    dy = obj1.y - obj2.y   # 
    K = math.hypot(dx, dy)   # 
    dvx = obj1.vx - obj2.vx   # 
    dvy = obj1.vy - obj2.vy   # 
    dv = math.hypot(dvx, dvy)  # 
    deltat = (R - K)/dv    # 
    print dv 
    print deltat 
    obj1.x = obj1.rect.centerx = obj1.x - obj1.vx # *deltat 
    obj2.x = obj2.rect.centerx = obj2.x - obj2.vx # *deltat 
    obj1.y = obj1.rect.centery = obj1.y - obj1.vy # *deltat 
    obj2.y = obj2.rect.centery = obj2.y - obj2.vy # *deltat 
    dx = obj2.x - obj1.x 
    dy = obj2.y - obj1.x 
    delta = math.hypot(dx, dy) 
    nx = dx/delta 
    ny = dy/delta 
    vx1bc = obj1.vx * nx 
    vx2bc = obj2.vx * nx 
    vy1bc = obj1.vy * ny 
    vy2bc = obj2.vy * ny 
    vx2ac = (obj2["energy_loss"]*(vx1bc - vx2bc) + vx1bc + (obj2["mass"]/obj1["mass"]*vx2bc))/((obj2["mass"]/obj1["mass"])+1) 
    vy2ac = (obj2["energy_loss"]*(vy1bc - vy2bc) + vy1bc + (obj2["mass"]/obj1["mass"]*vy2bc))/((obj2["mass"]/obj1["mass"])+1) 
    vx1ac = (vx1bc + obj2["mass"]/obj1["mass"]*vx2bc - obj2["mass"]/obj1["mass"]*vx2ac)*obj1["energy_loss"] 
    vy1ac = (vy1bc + obj2["mass"]/obj1["mass"]*vy2bc - obj2["mass"]/obj1["mass"]*vy2ac)*obj1["energy_loss"] 
    V1cx = obj1.vx * ny 
    V1cy = obj1.vy * ny 
    V2cx = obj2.vx * ny 
    V2cy = obj2.vy * ny 
    alfa = math.atan2(ny, nx) 
    alfa_deg = math.degrees(alfa) 
    v1a = math.hypot(vx1ac, vy1ac) 
    v2a = math.hypot(vx2ac, vy2ac) 
    obj1.vx = v1a*math.cos(alfa)+V1cx * math.sin(alfa) 
    obj2.vx = v2a*math.cos(alfa)+V2cx * math.sin(alfa) 
    obj1.vy = v1a*math.sin(alfa)+V1cx * math.cos(alfa) 
    obj2.vy = v2a*math.sin(alfa)+V2cx * math.cos(alfa) 
+1

잘못된 점에 대한 설명을 쓸 수 있습니까? 모든 사람이 내 동영상을보고 싶어하지는 않습니다. 또한, 직교 좌표가 아닌 벡터를 사용하면이 코드가 1,000 배 더 읽기 쉽습니다. –

+0

먼저 두 개의 물체가 서로 붙고 충돌 후 여러 번 잡힌 프레임이 엄청난 속도를냅니다. 벡터? 나는 그것들을 사용하고 싶지만 파이썬에는 벡터의 표준 구현이 없다. – Siekacz

+0

Python 표준 라이브러리를 고수 할 의무가 없습니다. 코드를 직접 작성할 수 있습니다! –

답변

0

당신의 코드가 서로 다른 변수를 많이 사용하고, 그들은 또한 그리 상대 이름이 . 따라서 모든 것을 따라 잡기가 어렵고 다른 사람들이 프로그램의 내용을보기가 어렵습니다. 어쩌면 목록에 변수를 추가하고 액세스해야합니까? 또한 위대한 물리학 자습서를 살펴 보는 것이 좋습니다. http://www.petercollingridge.co.uk/pygame-physics-simulation

+0

변수에 대해 하드 코딩 된 내용은 무엇입니까? – nneonneo

관련 문제