2017-10-30 3 views
0

EDIt : 질문이 다소 길어 보였으므로 다른 방법을 삭제 했으므로 그 방법이 불필요한 것처럼 보였습니다.원 - 서클 충돌이 정확하지 않음

센터, 반경, 이전 위치, 가속도, 질량 및 반발과 같은 속성을 갖는 원 클래스가 있습니다.

다음이 링크 당의 임펄스 해상도를 적용합니다.

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) 
: 여기

는 (필자는 impulseScalar 방법의 끝 부분 원의 이전 위치의 값을 변경할 이유가 설명 하듯이 필요합니다) 구현 verlet 내 속도와 함께 것을 구현하는 코드입니다

당신이 벡터 값을 액면 그대로 받아 들인다면 도움이 될 것입니다. 그리고 나는 그것들이 무엇을하는지 알아낼 수 있도록 충분히 이름이 붙여 졌다고 생각합니다.

내 주된 문제는 내가 이것을 실행할 때 충돌이 발생했지만 두 번째 원의 값 위치가 변경되지 않는다는 것입니다. 이 문제를 해결하는 방법은 무엇입니까, 정확하게 계산을 구현하는 것 같습니다.

제 1 및 제 2 원의 값은 다음과 같습니다

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 

그래서 확실히, INTERSECTION를 인쇄 할 때 impulseScalar 메서드가 올바른 경우 고정 원이 위치를 변경해야합니다 (해당 링크에서 말한 내용을 따르기 때문에)

내가 l onger, 고정 원은 여전히 ​​움직이지 않습니다.

+0

'AABBintersection'이 False를 반환 할 때 True를 반환하는 문제가 있습니까? 그렇다면 코드를 표시해야합니다. 그렇지 않다면 정확한 문제를 명확히 할 수 있습니까? –

+0

아마 이것도 메인 파트에 포함시켜야하지만, 충돌 탐지가 올바르게 작동해야합니다. 예를 들어, 원점에 반경 1이있는 정지 원과 일부 높이에서 반경 3이 떨어지는 정지 원이있는 경우 하강하는 원의 중심이 대략 (0,4) 일 때 교차점이 있지만, 두 번째 원은 충돌로부터 어떤 속도도 얻지 않고 단지 (0,0)에 머물러 있다는 것입니다. – Bob

+0

그래서 문제가 'impulseScalar'인 것 같습니까? 문제를 볼 때 자기 자신과 다른 사람의 가치는 무엇입니까? 이 경우 예상되는 결과는 무엇입니까? 실제 결과는 무엇입니까? –

답변

0

음수의 연산에주의하십시오. 어쩌면 당신은 그로 인해 원하지 않는 방식으로 가치를 변화시킬 수 있습니다. 사방에 sqrt를 사용하십시오.

관련 문제