3

私は、自分が取り組んでいるゲームに適応して使用できる衝突回避の例を見つけようとしています。丘の上の木を避けるためにスキーヤーの動きをモデル化するために使用されます。私は自律キャラクターのステアリング動作に基づいて動きを基にしており、パスの追跡と群れの良い例はたくさんありますが、衝突を回避するための良い例は見つかりません。 Nature of CodeのWebサイトには、ステアリングに関するすばらしいチュートリアルがありましたが、障害物の回避以外のすべてをカバーしているようでした。

ここからコードを変換しましたが、障害物の中心が衝突の範囲外にある可能性があるが、円がまだある場合を考慮せずに、障害物の中心を速度ベクトルに投影することによって衝突が検出されるため、正常に機能しません。衝突します。これが私が適応させたコードです(Processing(Javaベース)で書かれています)。

// Method to update location
void update() {
  // Update velocity
  vel.add(acc);
  // Limit speed
  vel.limit(maxspeed);
  loc.add(vel);
  // Reset accelertion to 0 each cycle
  acc.mult(0);
}

void obstacleAvoid() {
  float checkLength = 30*vel.mag();
  PVector forward,diff,ray,projection,force;
  float dotProd,dis;
  forward = vel.get();
  forward.normalize();
  ray = forward.get();
  ray.mult(checkLength);
  for ( int i = 0; i < obs.size(); i++ ) {
    Obstacle ob = (Obstacle)obs.get(i);
    diff = ob.pos.get();
    diff.sub(loc);
    PVector temp2 = forward.get();
    temp2.mult(ob.r);
    diff.sub(temp2);
    dotProd = diff.dot(forward);
    if ( dotProd > 0 ) {
      projection = forward.get();
      projection.mult(dotProd);
      dis = PVector.dist(projection,diff);
      if ( (dis < (ob.r + r)) && (projection.mag() < ray.mag()) ) {
        ob.hit = true;
        force = forward.get();
        force.mult(maxforce);
        if ( sign(diff,vel) == -1 ) { //CCW
          force.set(force.y,-force.x,0);
        }
        else { //CW
          force.set(-force.y,force.x,0);
        }
        force.mult(1-(projection.mag())/ray.mag());
        force.limit(maxforce);
        acc.add(force);
      }
    }
  }  
}

ですから、私を助けるために、自律キャラクターのステアリング動作をより良くする方法 に従う衝突回避の完全な例を誰かが知っているかどうか疑問に思いました。このサイトは、この論文のアプレットの例であり、コードを表示したい正確な例です。残念ながら、付属のコードがなく、逆コンパイルしてみましたが、メインクラスが表示されただけなので、あまり役に立ちませんでした。誰かがこの例またはそのようなもののコード、またはチュートリアルを持っているなら、私はそれを大いに感謝します。

4

2 に答える 2

1

Craig Reynolds は、関心のあるアプレットのソース コードをリリースできません。同様のソース コードは、Reynolds によって管理されているOpenSteerで c++ で入手できます。Christian Schnellhammer と Thomas Feilkas は、Reynolds のオリジナルの論文の拡張に取り組みました。彼らの論文は英語に翻訳されており、障害物回避に関するセクションが含まれています。彼らの作品のソース コードはJavaで入手できます。ただし、シフマンのコードは素晴らしい出発点だと思います。すでに必要なものにかなり近づいているようです

私の最初の処理プログラムの 1 つは、ゾンビの黙示録をシミュレートするために Boids の例を変更しました。三角形は、それらを避けていた円を追いかけました。各生存者は、ビジョン内の他のゾンビをチェックし、関数 で脅威の位置ベクトルを平均化しますPVector panic(ArrayList infected)。その後、他の力と同様に、新しいベクトルに負の重みを付け、それを生存者の現在のベクトルに追加することが問題でした. 何かのようなもの:

void flock(ArrayList uninfected, ArrayList infected) {
  PVector sep = separate(uninfected);   // Separation
  PVector ali = align(uninfected);      // Alignment
  PVector coh = cohesion(uninfected);   // Cohesion
  PVector pan = panic(infected);        // Panic
  // Arbitrarily weight these forces
  sep.mult(4.0);
  ali.mult(1.0);
  coh.mult(2.0);
  pan.mult(-3.0);
  // Add the force vectors to acceleration
  acc.add(sep);
  acc.add(ali);
  acc.add(coh);
  acc.add(pan);
}

スキーヤーが障害物をうまく検出している場合、問題は回避です。回避ベクトルに強いウェイトを追加したり、スキーヤーがオブジェクトとやり取りするために「見える」半径を大きくしたり、スキーヤーに最も近いポイントの位置を返すメソッドをオブジェクトに追加したりすることで、問題を解決できます。スキーヤーから前方の最も近い障害物までの距離に基づいて減速を追加することもできます。

関心のあるアプレットでさえ、障害物を完全に回避するわけではないことに注意してください。私の解決策は、アプレットで起こっていることとまったく同じではないかもしれませんが、スキーヤーの方向を決定する力をいじることで、非常によく似た (そしておそらくより良い) 効果を得ることができます。

于 2010-12-14T06:23:29.120 に答える
0

NEHE ゲーム開発サイトの次のリンクをチェックしてください。

このチュートリアルでは、衝突検出、衝突応答、および物理ベースのモデリング効果の基本について学習します。このチュートリアルでは、重要なコードはすべて説明されていますが、実際のコードよりも衝突検出の仕組みに重点を置いています。

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=30

これは、c++ および win32 API を使用して行われます。ただし、 JOGL を使用したJava ポートへのリンクがあります。

また、C++ のソース コードhttp://www.red3d.com/cwr/steer/はこちらから入手できます。http://opensteer.sourceforge.net/確認しましたか??

于 2010-11-29T04:52:16.687 に答える