私は、自分が取り組んでいるゲームに適応して使用できる衝突回避の例を見つけようとしています。丘の上の木を避けるためにスキーヤーの動きをモデル化するために使用されます。私は自律キャラクターのステアリング動作に基づいて動きを基にしており、パスの追跡と群れの良い例はたくさんありますが、衝突を回避するための良い例は見つかりません。 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);
}
}
}
}
ですから、私を助けるために、自律キャラクターのステアリング動作をより良くする方法 に従う衝突回避の完全な例を誰かが知っているかどうか疑問に思いました。このサイトは、この論文のアプレットの例であり、コードを表示したい正確な例です。残念ながら、付属のコードがなく、逆コンパイルしてみましたが、メインクラスが表示されただけなので、あまり役に立ちませんでした。誰かがこの例またはそのようなもののコード、またはチュートリアルを持っているなら、私はそれを大いに感謝します。