2016-12-05 3 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は(pygameの中に実装されている)私のプロジェクト

+0

興味深いアルゴリズムですが、これまで聞いたことはありませんが、非常に便利です! [this](http://www.dyn4j.org/2010/04/gjk-distance-closest-points/)リンクを見ましたか? Pythonではないにもかかわらず、距離部分のコードでアルゴリズムを実装しているようです。 – CodeSurgeon

答えて

0

OKですが、エラーを検出しました。実装上ではなく、私が以前に作った関数: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) 

シンプレックスの最遠点を除去します三角形であるため、アルゴリズムを続行するために2つの最も近い点(原点)を取得します。

関連する問題