Menemukan kecepatan yang tepat bagi AI untuk berbalik untuk mencapai tujuan

10

Saya memiliki kapal yang bergerak dengan kecepatan maksimal maxSpeeddan dapat mengubah rotationSpeedderajat per detik. Kapal selalu bergerak ke arah yang dihadapinya yang berarti bahwa semakin cepat kapal bergerak semakin besar radius beloknya.

Saya tahu posisi saya, dan rotasi serta posisi target.

Yang ingin saya ketahui adalah apakah target berada di dalam radius belokan saya pada kecepatan ini, atau lebih baik, berapa kecepatan maksimum yang bisa saya tempuh untuk membuat belokan ke target tanpa terus berputar di sekitarnya.

Apakah ada cara (ish) yang efisien untuk melakukan ini?

Inilah yang saya pikirkan sejauh ini: karena saya tahu sejauh mana saya bepergian per langkah dan seberapa banyak saya berputar per langkah, saya bisa mengetahui di mana saya akan berada dalam dua frame berikutnya. Posisi saya saat ini adalah p1, posisi saya berikutnya adalah p2 kemudian p3. Saya dapat mengambil garis-garis tegak lurus (p1, p2) dan (p2, p3). Titik persimpangan mereka akan memberi saya pusat lingkaran. Saya kemudian dapat menguji apakah target ada di lingkaran itu.

Saya tidak yakin apakah ini akan berfungsi dalam 3D (Saya tidak yakin bagaimana cara menghitung bola dengan input saya). Solusi ini juga tidak banyak membantu dalam menemukan kecepatan yang tepat untuk bepergian, saya harus mencoba beberapa kali dengan kecepatan yang berbeda untuk menemukan yang masuk akal.

Adakah yang bisa menjelaskan solusi yang lebih baik?

weichsem
sumber

Jawaban:

17

Ada dua cara unit yang dikendalikan AI dengan kecepatan rotasi terikat dan kecepatan gerakan yang dapat disesuaikan dapat mencapai tujuan.

Pertama, mari kita pertimbangkan tantangan yang kita hadapi sehingga kita bisa memahaminya dengan lebih baik:

masukkan deskripsi gambar di sini

Jika pemain bergerak dan berputar dalam kecepatan konstan saat mencoba mencapai tujuan yang ada di sisi kanan atau kiri, itu akan bergerak dalam lingkaran selamanya, tidak pernah menghadapi tujuan itu. Dua area yang akan dilingkari pemain ditandai dengan warna merah di atas.

Area melingkar yang ditandai dengan warna merah dapat dihitung seperti ini:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

Ini menghasilkan posisi dan jari-jari lingkaran merah. Kita dapat menggunakan ini untuk menentukan apakah tujuan tertentu berada di luar jangkauan unit yang dikendalikan AI jika terus mengarah ke arah tujuan.

Untuk mengetahui apakah item tertentu berada dalam salah satu lingkaran, kami cukup menghitung jarak dari pusat lingkaran:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

Ada dua solusi yang mungkin untuk ini:

1.

Membangun jarak sampai tujuannya berada di luar area merah melingkar dan kemudian berbalik dalam mode u-turn seperti. Ini sederhana, biarkan unit terus bergerak sampai cek kembali bahwa tujuannya tidak ada dalam lingkaran ini. Maka Anda bisa berbalik.

masukkan deskripsi gambar di sini

Opsi lain membutuhkan sedikit lebih banyak pekerjaan untuk menghitung:

Kami menggambar garis imajiner antara unit AI dan tujuan. Menggunakan sudut di antara mereka:

angle = Math.atan2(goalY - unitY, goalX - unitX);

Sekarang Anda perlu melakukan hal berikut untuk menghitung kecepatan yang benar:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

masukkan deskripsi gambar di sini

Untuk membuatnya berfungsi dalam case 3d:

Temukan pesawat tempat tiga poin berikut berada:

  1. Titik tujuan.
  2. Posisi unit AI di bingkai sebelumnya.
  3. Posisi unit AI saat ini.

Anda bisa menggunakan pesawat itu untuk menghitung kecepatan dengan cara 2d. Anda hanya perlu mengubah titik-titik dari nilai 3d mereka ke nilai 2d yang tertanam pada bidang umum mereka.

Anda mungkin ingin menggunakan ini:

Bagaimana cara mengubah titik 3D di pesawat ke koordinat UV?

AturSams
sumber
Sempurna! Tepat jawaban yang saya harapkan! Terima kasih atas penjelasan terperinci Anda, saya pikir saya dapat memperkirakan hal ini dan menggunakannya dalam 3D.
weichsem
@ weichsem Saya memperbarui jawabannya. Gagasan yang saya sarankan adalah menemukan dataran 2d yang umum mereka bagikan dan menggunakannya untuk menghitung kecepatan yang benar.
AturSams