Saya sedang mengerjakan beberapa gerakan AI di mana tidak ada rintangan dan gerakan terbatas pada pesawat XY. Saya menghitung dua vektor, v , arah menghadap kapal 1, dan w , vektor menunjuk dari posisi kapal 1 ke kapal 2.
Saya kemudian menghitung sudut antara dua vektor ini menggunakan rumus
arccos((v · w) / (|v| · |w|))
Masalah yang saya alami adalah bahwa arccos
hanya mengembalikan nilai antara 0 ° dan 180 °. Ini membuat tidak mungkin untuk menentukan apakah saya harus belok kiri atau kanan untuk menghadapi kapal lain.
Apakah ada cara yang lebih baik untuk melakukan ini?
Mathf.DeltaAngle()
.Jawaban:
Jauh lebih cepat menggunakan produk lintas 2d. Tidak ada fungsi trigonometri yang mahal.
Jika Anda masih membutuhkan sudut yang sebenarnya saya sarankan menggunakan
atan2
.atan2
akan memberi Anda sudut absolut dari vektor apa pun. Untuk mendapatkan sudut relatif antara vektor apa pun, hitung sudut absolutnya dan gunakan pengurangan sederhana.sumber
arccos
. Dengan cara ini Anda hanya akan menggunakan satu fungsi trigonometri, tetapi masih memiliki sudut yang sebenarnya. Namun saya sarankan menentang optimasi ini sampai Anda yakin pelacakan sudut AI Anda membuat dampak nyata pada kinerja game Anda.if( cross == -0.0f )
vs Anda jugaif( cross == 0.0f )
terlihat sangat rapuh.Gunakan arcsin produk lintas 2D (yaitu komponen z dari vektor produk silang). Itu akan memberi Anda -90 hingga 90 yang akan memberi tahu Anda apakah harus ke kiri atau kanan.
Hati-hati karena A cross B tidak sama dengan B cross A.
Strategi lain (tapi mungkin tidak lurus ke depan) adalah menghitung "heading" dari dua vektor menggunakan atan2 dan kemudian mencari tahu apakah A menunjuk pada derajat X perlu ke kiri atau kanan untuk pergi ke B menunjuk pada derajat y.
sumber
Gunakan vektor untuk mengarahkan ulang kapal. Ini adalah cara kerja "kemudi perilaku" - Anda tidak perlu menghitung sudut, cukup gunakan vektor yang Anda miliki. Komputasi ini jauh lebih murah.
Vektor
w
(vektor dari Kapal 1 ke Kapal 2) adalah semua informasi yang Anda butuhkan. Ubah salah satu vektor kecepatan 1 kapal atau vektor percepatan 1 kapal (atau bahkan vektor heading langsung) menggunakan versi tertimbangw
.The besarnya seberapa jauh dari kapal 1 adalah tentu saja (seberapa parah v tidak cocok dengan w) dapat ditemukan dengan menggunakan (
1 - dot(v,w)
)dot(v,w)
Dimaksimalkan kapanv
danw
berbaris tepat)1 - dot(v,w)
) memberi 0 kapanv
danw
benar-benar berbaris, disediakanv
danw
dinormalisasi)sumber
Ada cara sederhana untuk menemukan sudut absolut vektor melalui geometri normal.
misalnya vektor V = 2i - 3j;
nilai absolut dari x koefisien = 2;
nilai absolut dari koefisien y = 3;
angle = atan (2/3); [sudut akan berada di antara 0 hingga 90]
Berdasarkan sudut kuadran akan diubah.
jika (koefisien x <0 dan koefisien y> 0) maka sudut = 180-sudut;
jika (x koefisien <0 dan koefisien y <0) maka sudut = 180 + sudut;
jika (x koefisien> 0 dan koefisien y <0) maka sudut = 360-sudut;
jika (x koefisien> 0 dan koefisien y> 0) maka sudut = sudut;
setelah menemukan sudut vektor pertama dan kedua, cukup kurangi sudut vektor pertama dari vektor kedua. Maka Anda akan mendapatkan sudut absolut antara dua vektor.
sumber
Mungkin saya harus memposting pertanyaan yang sedikit berbeda dan menjawabnya sendiri; ini adalah pertanyaan terdekat yang bisa saya temukan dengan pertanyaan yang saya miliki.
Saya melakukan pekerjaan 2D di kanvas html, di mana saya memiliki sudut rotasi di radian daripada vektor. Saya membutuhkan "turn angle" (ta) untuk mendapatkan dari "heading saat ini" (h) ke "target heading" (t).
Inilah solusi saya:
sumber