Putar objek ke pemain muka

8

Ini mungkin pertanyaan vektor sederhana, tapi saya tidak yakin bagaimana melakukannya.

Saya memiliki objek pada posisi vektor (ox,oy). Berpotensi setiap pembaruan, pengguna berjalan di sekitar layar, dan akan berada pada posisi (px,py)pada saat tertentu. Bagaimana cara membuatnya agar objek selalu menghadap pemain? Saya perlu mendapatkan sudut dalam derajat.

Ini adalah apa yang saya telah main-main dengan, tetapi arahnya tidak langsung menunjuk ke tempat pengguna berada. Sebagai gantinya, itu perlahan-lahan bertambah ke arah pengguna berjalan.

 objVec.Normalize(); 
 playerVec.Normalize();

 obj.Rotation = MathHelper.ToDegrees((float)Math.Acos(Vector2.Dot(objVec, playerVec)));

Saya mungkin salah sepenuhnya, jadi bantuan apa pun dihargai!

XSL
sumber
kemungkinan duplikat dari Berorientasi model untuk menghadapi target
Nicol Bolas

Jawaban:

13

Pikirkan masalahnya secara berbeda. Anda ingin objek selalu "menghadap" pemain, yang berarti Anda ingin vektor "maju" -nya diputar sejajar dengan vektor dari dirinya sendiri ke pemain. Dengan asumsi vektor "maju" pada umumnya obj.Rotation = 0, rotasi yang tepat pada dasarnya adalah arctangent Vector2.Subtract(playerPos, objectPos). Sebagian besar perpustakaan matematika akan memiliki sesuatu seperti atan2itu mengambil dua argumen atau Vector2yang secara otomatis akan mencari kuadran yang tepat untuk Anda.

EDIT: Saya menyadari bahwa Anda berada di C # dan ini sebenarnya adalah kelas bawaan. Jadi Anda tidak harus pergi mencari dokumentasi perpustakaan matematika, saya bisa melakukannya untuk Anda. Kode yang benar adalah:

Vector2 facingVec = playerVec - objVec;
obj.Rotation = MathHelper.ToDegrees((float)Math.Atan2(facingVec.Y, facingVec.X));

Perhatikan pembalikan X / Y; untuk kismis histeris, Atan2 selalu memiliki argumen yang terbalik.

Paul Z
sumber
Terima kasih, itu berhasil. Saya pikir saya sudah mencobanya sebelumnya, tetapi begitu saya menghapus Normalisasi, itu berhasil.
XSL
1
Sangat menggoda untuk menormalkan setiap vektor yang Anda temui, tetapi itu tidak selalu merupakan ide yang baik. Anda ingin memastikan untuk menghapus perbedaan antara posisi dan arah; arah dapat dinormalisasi dengan aman, tetapi posisi tidak boleh. Dalam hal ini, objVec dan playerVec jelas merupakan posisi dari masing-masing entitas, dan tidak boleh dinormalisasi.
Paul Z
9
Siapa kismis histeris yang Anda bicarakan ini? Apakah mereka enak?
Olhovsky