それぞれの子孫の中にないBVH衝突トラバーサルアルゴリズム

私はこのコードをご覧になっていますBVHトラバーサルアルゴリズム、具体的には getPotentialContacts ゲーム物理エンジンの開発 >および getPotentialContactsWith をクリックします。

このアルゴリズムの外観では、最初の兄弟ペアを比較しますが、各子孫内の衝突は検索されません。

点線はブランチを表し、ソリッドは葉ノードであり、ツリー深度はスペクトルカラー(赤、オレンジ、黄、緑)で表されます。

BVH problem

ここで私が理解していないのは何ですか?ツリー内のすべての連絡先を見つけるために別のアルゴリズムが必要ですか?

私はまた、それぞれの葉を横断しようとしましたが、多くの場合、衝突を2回検出することになりました。

2

1 答え

私はこの機能で同じ問題を抱えていました...そこで私はいくつかのアプローチを試みましたが、私はこれで終わりました:

  private  int getPotentialContactsWith(
         BVHNode other,
        Vector contacts,boolean descend) {

      int count=0;
      //System.out.println(id+" comparando com "+other.id+" contacts.size:"+contacts.size());
      checks++;
     //Early out if we don't overlap or if we have no room
     //to report contacts

      if ((descend) && (!isLeaf())) {
         count += children[0].getPotentialContactsWith(
               children[1], contacts,descend);
      }

      if ((descend) && (!other.isLeaf())) {
         count += other.children[0].getPotentialContactsWith(
                other.children[1], contacts,descend);
       }


        if(!overlaps(other)) return 0;




     //If we're both at leaf nodes, then we have a potential contact
      if (isLeaf() && other.isLeaf())
      {
          if (!alreadyInside(body,other.body,contacts)){
              PotentialContact contact=new PotentialContact(body,other.body);
              contacts.add(contact);} else {errors++;}
          return 1;
      }


     //Determine which node to descend into. If either is
     //a leaf, then we descend the other. If both are branches,
     //then we use the one with the largest size.
      if (other.isLeaf() ||
          (!isLeaf() && volume.getSize() >= other.volume.getSize()))
      {
         //Recurse into ourself
          count += children[0].getPotentialContactsWith(
              other, contacts,false
              );

         //Check we have enough slots to do the other side too
              count += children[1].getPotentialContactsWith(
                  other, contacts,false );
      }
      else
      {
         //Recurse into the other node
          count += getPotentialContactsWith(
              other.children[0], contacts,false);

         //Check we have enough slots to do the other side too
              count += getPotentialContactsWith(
                  other.children[1], contacts,false
                  );

      }


      return count;
    }

//// コードについて: まあ、そのJavaでは、私は簡単に翻訳するか、それが何をしているのか理解しています。 私は、既に潜在的な連絡先を追加したかどうかを確認するために "alreadyInside"関数を作成しましたが、これを行うと変数エラーが増えていました。関数を使用してコードを最適化します。 また、「descend」パラメータを追加しました。このパラメータは、構造のさらに下に進むべき時を示すフラグです。

0
追加された
ありがとう、それは動作するようです。ノードの更新を実装するときにお知らせしますので、あなたと共有することができます。
追加された 著者 Rei Miyasaka,