Saya membuat simulator kemudi kecil menggunakan algoritma Reynolds boid. Sekarang saya ingin menambahkan fitur penghindaran dinding. Dinding saya dalam 3D dan didefinisikan menggunakan dua titik seperti itu:
---------. P2
| |
P1 .---------
Agen saya memiliki kecepatan, posisi, dll ...
Bisakah Anda memberi tahu saya cara menghindar dengan agen saya?
Vector2D ReynoldsSteeringModel::repulsionFromWalls()
{
Vector2D force;
vector<Wall *> wallsList = walls();
Point2D pos = self()->position();
Vector2D velocity = self()->velocity();
for (unsigned i=0; i<wallsList.size(); i++)
{
//TODO
}
return force;
}
Kemudian saya menggunakan semua kekuatan yang dikembalikan oleh fungsi boid saya dan saya menerapkannya pada agen saya.
Saya hanya perlu tahu bagaimana melakukannya dengan dinding saya.
Terima kasih atas bantuan Anda.
ai
steering-behaviors
Vodemki
sumber
sumber
Jawaban:
Biarkan setiap dinding memberi pengaruh pada kecepatan.
Cobalah sesuatu seperti menggunakan jarak invers (atau kuadrat jarak kuadrat) dari dinding untuk menentukan besarnya gaya yang setiap dinding "berikan", dan normal dinding untuk menentukan arah gaya yang dinding "berikan".
Jadi di sini boid berinteraksi dengan 4 dinding. Karena produk titik dari vektor merah (boid-to-wall-center) lebih besar dari 0 untuk 3 dari 4 dinding, dinding tersebut tidak akan memberikan gaya pada boid.
Hanya dinding dengan vektor biru (produk titik negatif) yang memiliki kekuatan.
Besarnya gaya harus besar dengan boid terlalu dekat ke dinding, dan arah gaya harus ke arah panah hitam di dinding (menunjuk langsung menjauh dari dinding).
Jika Anda menggunakan
1 / (t+1)
untuk besarnya gaya, di manat
jarak dari dinding, maka gaya akan benar-benar kuat ketika mendekati 0, tetapi memudar menjadi nol ketika t semakin tinggi (perhatikan skala sumbu pada diagram, itu adalah tidak 0 ketika t = 5, itu adalah 0,2). (T + 1 adalah agar Anda tidak mendapatkan kekuatan tak terbatas / bagi dengan 0 jika boid kebetulan memasuki dinding).Jika Anda menggunakan
1/(t^2+1)
, maka kekuatannya jauh lebih tajam di dekat dinding, dan jatuh lebih cepat / lebih halus.Percobaan dengan itu dan lihat apa yang Anda suka.
sumber
Jika seseorang membutuhkan kode, ini dia, jangan ragu untuk mendistribusikannya kembali. Saya sudah mencoba berkomentar agar lebih dimengerti. Berdasarkan solusi bobobobo .
sumber