Saya memiliki dua objek (target dan pemain), keduanya memiliki Posisi (Vector3) dan Rotasi (Quaternion). Saya ingin target berputar dan menghadap tepat ke pemain. Targetnya, ketika menembak sesuatu harus menembak tepat ke pemain.
Saya telah melihat banyak contoh slerping kepada pemain, tapi saya tidak ingin rotasi tambahan, well, saya kira itu akan baik-baik saja selama saya bisa membuat slerp menjadi 100%, dan selama itu benar-benar berfungsi.
FYI - Saya dapat menggunakan posisi dan rotasi untuk melakukan banyak hal lain dan semuanya bekerja dengan baik kecuali bagian terakhir ini yang tidak dapat saya pahami.
Contoh kode dijalankan di kelas Target, Posisi = posisi target, Avatar = pemain.
EDIT
Saya sekarang menggunakan kode c # Maik yang telah dia sediakan dan bekerja dengan sangat baik!
0*(rotation A) + 1*(rotation B)
- dengan kata lain, Anda hanya mengatur rotasi ke rotasi B. Slerp hanya untuk menentukan seperti apa rotasi itu (0% <x <100%) dari jalan di antaranya.Jawaban:
Ada lebih dari satu cara untuk melakukannya. Anda dapat menghitung orientasi absolut atau rotasi relatif terhadap avatar Anda, itu berarti orientasi baru Anda = avatarOrientation * q. Inilah yang terakhir:
Hitung sumbu rotasi dengan mengambil produk silang dari vektor unit forward avatar Anda dan vektor unit dari avatar ke target, vektor forward baru:
Hitung sudut rotasi menggunakan produk-titik
Buat angka empat menggunakan rotAxis dan rotAngle dan gandakan dengan orientasi avatar saat ini
Jika Anda perlu bantuan menemukan vektor maju avatar saat ini, input untuk 1. tembak saja :)
EDIT: Menghitung orientasi absolut sebenarnya sedikit lebih mudah, gunakan vektor forward dari matriks identitas daripada vektor forward avatar sebagai input untuk 1) dan 2). Dan jangan gandakan dalam 3), alih-alih gunakan langsung sebagai orientasi baru:
newRot = q
Penting untuk dicatat: Solusi ini memiliki 2 anomali yang disebabkan oleh sifat dari produk-silang:
Jika vektor maju sama. Solusi di sini adalah hanya mengembalikan angka empat identitas
Jika titik vektor tepat di arah yang berlawanan. Solusi di sini adalah membuat angka empat dengan menggunakan sumbu avatar sebagai sumbu rotasi dan sudut 180,0 derajat.
Berikut ini adalah implementasi dalam C ++ yang menangani kasus tepi tersebut. Mengubahnya ke C # seharusnya mudah.
EDIT: Versi diperbaiki dari kode XNA Marc
sumber
newForward
rotAngle
rotAxis
danreturned quaternion
. Kode untuk massa akan sama, setelah kami membuatnya bekerja dengan avatar, akan mudah untuk mengubah judul objek apa pun.