2016-12-05 9 views
0

저는 벡터/매트릭스 라이브러리뿐만 아니라 처음부터 내 물리 엔진을 설계하려고합니다. 내 라이브러리에서 충돌 감지를 구현할 때까지 지금까지 모든 것이 훌륭하게 작동했습니다. SAT와 함께 처음에는 탐지를 위해 잘 작동했지만 객체들 사이의 거리를 찾고 싶었습니다. 그런 다음 원점과 다각형 사이의 거리를 찾을 수 있는지 확인하기 위해 GJK 거리 알고리즘을 구현하려고했습니다. 나는 처음부터 다른 라이브러리를 만든 알지만, 난GJK 거리 알고리즘을 구현할 수 없습니다.

stack1.png

:하지만 그냥 구현 된 알고리즘에 의해 감지 된 최소 거리가 다각형의 정점 중 하나였다 작동하지 않습니다 그들이 일하고 있다는 긍정적입니다. 나는 오류입니다 생각,하지만 난 것을, 사람들이 코드 조각입니다

def support(self,axis): 
    maxP = self.nodes[0]*axis #dot product of first vertex with the axis 
    n = self.nodes[0] 
    for node in self.nodes[1:]: 
     p = node*axis 
     if p>maxP: 
      maxP = p 
      n = node 
    return node 

:

#objectL[0] is a hexagon 
    v = objectL[0].nodes[0] 
    W = [] 
    u = 0 
    close_enough = False 
    while not close_enough and v != Vector(0,0): 
     w = objectL[0].support(-v) 
     d = v*w/abs(v) #*:dot product abs:magnitude 
     u = max(u,d) 
     close_enough = abs(v) - u <= 0.0001 
     if not close_enough: 
      W.append(w) 
      while len(W)>2: 
       del W[0] 
      v = Vector(0,0).vectorToLine(*W) #distance from the origin to the simplex 
              #formed by W 

그리고 지금 지원 방법 : 어쨌든, 여기에 내가 GJK을 구현 한 코드입니다 그것을 찾을 수 없습니다. here에서 복사 한 GJK 알고리즘입니다. 감사!

편집 : Here은 (파이 게임에서 구현) 내 프로젝트 확인

+0

흥미로운 알고리즘으로 이전에는 들어 보지 못했지만 매우 유용하게 보입니다! [this] (http://www.dyn4j.org/2010/04/gjk-distance-closest-points/) 링크를 살펴 보셨습니까? python이 아니더라도 먼 거리의 코드에서 알고리즘을 구현 한 것처럼 보입니다. – CodeSurgeon

답변

0

가 오류를 발견합니다. 어떤 구현,하지만 오히려 이전에 만든 기능 : n 대신 node 반환하고 잘못된 벡터 (음수)를 반환했습니다 vectorToLine 함수를 지원합니다. 또한 지금부터이 게시물 년을 읽고,이 알고리즘을 구현하려고하는 것들에 대한

, 나는 단지 변경주의하시기 바랍니다 while len(W)>2 부분 :

심플 렉스의 가장 먼 지점을 제거
   while len(W)>2: 
       maxD = 0 
       for w in W: 
        if abs(w)>maxD: 
         maxD = w 
       W.remove(maxD) 

/삼각형이므로 알고리즘을 계속 진행하기 위해 두 개의 가장 가까운 점 (원점까지)을 얻습니다.

관련 문제