Saya memiliki model 3D menara yang berputar di sekitar sumbu Y. Menara ini memiliki meriam yang jauh dari pusat objek. Saya ingin meriam, bukan menara, untuk membidik target yang ditentukan. Namun, saya hanya dapat memutar turet, dan karenanya saya tidak tahu persamaan apa yang perlu saya terapkan untuk menyelesaikan dengan objektif.
Gambar berikut menggambarkan masalah saya:
Jika saya memiliki menara "LookAt ()" target, laser yang berasal dari meriam akan benar-benar kehilangan target kata.
Jika ini benar-benar skenario top-down, dan meriam itu persis sejajar dengan menara, maka logika saya memberi tahu saya bahwa target palsu harus ditempatkan pada posisi yang sama dengan target aktual ditambah offset yang sama dengan yang di antara menara dan meriam. Namun, dalam skenario saya yang sebenarnya, kamera saya miring 60º, dan meriam memiliki sedikit rotasi.
Gambar berikut menggambarkan skenario:
Saya tidak yakin persis mengapa, tetapi jika saya menerapkan offset yang sama, itu hanya berfungsi saat membidik jarak tertentu dari turet.
Apakah logika saya cacat? Apakah saya melewatkan sesuatu yang mendasar di sini?
Edit Terakhir: solusi yang disediakan oleh @JohnHamilton, pembaruan terbaru memecahkan masalah ini dengan presisi sempurna. Saya sekarang telah menghapus kode dan gambar yang saya gunakan untuk menggambarkan implementasi yang salah saya.
sumber
Jawaban:
Jawabannya sebenarnya cukup mudah jika Anda melakukan perhitungan. Anda memiliki jarak tetap Y dan jarak variabel X (Lihat Gambar 1). Anda perlu mengetahui sudut antara Z dan X dan memutar menara Anda lebih dari itu.
Langkah 1 - Dapatkan jarak antara garis menara (V) dan garis pistol (W) yang merupakan Y (ini konstan tetapi tidak ada salahnya untuk menghitung). Dapatkan jarak dari turet ke target (yaitu X).
Langkah 2 - Bagi Y dengan X dan kemudian dapatkan nilai Hyperbolic Sine
Langkah 3 - Putar turret lebih dari itu (di sekitar sumbu yang bergerak dari atas ke bawah, kemungkinan besar sumbu atas tetapi hanya Anda yang dapat mengetahui bagian itu).
Tentu saja dalam kasus ini, Anda perlu memutar berlawanan arah jarum jam sehingga Anda mungkin perlu menambahkan minus di depan turnAngle di sana, seperti pada
-turnAngle
.Mengedit beberapa bagian. Terima kasih kepada @ens untuk menunjukkan perbedaan jarak.
OP mengatakan senjatanya memiliki sudut jadi di sini kita pergi, gambar dulu, penjelasan nanti:
Kita sudah tahu dari perhitungan sebelumnya di mana mengarahkan garis merah sesuai dengan garis biru. Jadi membidik garis biru pertama:
Satu-satunya perhitungan yang berbeda di sini, adalah perhitungan "X Prime" (X ') karena sudut antara pistol dan turret (sudut "a") mengubah jarak antara garis.
Bagian selanjutnya ini HANYA diperlukan jika Anda melakukan modular senjata meriam (yaitu pengguna dapat mengubah senjata pada menara dan senjata yang berbeda memiliki sudut pandang yang berbeda). Jika Anda melakukan ini di editor, Anda sudah bisa melihat apa sudut pistol sesuai dengan menara.
Ada dua metode untuk menemukan sudut "a", satu adalah metode transform.up:
Teknik di atas akan menghitung dalam 3D, jadi jika Anda menginginkan hasil 2D, Anda harus menyingkirkan sumbu Z (itulah yang saya asumsikan di mana gravitasi berada, tetapi jika Anda tidak mengubah apa pun, di Unity itu sumbu Y yang naik atau turun, yaitu gravitasi ada di sumbu Y, jadi Anda mungkin harus mengubah keadaan):
Cara kedua adalah metode rotasi (saya berpikir dalam 2D dalam kasus ini):
Sekali lagi, semua kode ini akan memberi Anda nilai-nilai yang positif, jadi Anda mungkin harus menambah atau mengurangi jumlah tergantung pada sudut (ada perhitungan untuk itu juga, tapi saya tidak akan pergi yang mendalam). Tempat yang baik untuk memulai ini adalah
Vector2.Dot
metode di Unity.Blok kode terakhir untuk penjelasan tambahan tentang apa yang kami lakukan:
Jika Anda melakukan semuanya dengan benar, Anda harus mendapatkan adegan seperti ini ( tautan untuk paket unity ): Yang saya maksud dengan selalu nilai positif:
Metode Z dapat memberikan nilai negatif:
Untuk contoh adegan, dapatkan paket unity dari tautan ini .
Berikut kode yang saya gunakan dalam adegan (di menara):
Kode yang diadaptasi 3D dengan X dan Z sebagai bidang 2D:
sumber
Anda juga bisa menggunakan pendekatan yang lebih umum:
Matematika untuk masalah Anda sudah ada dalam bentuk skalarproduk (atau produk titik) . Anda hanya perlu mendapatkan arah sumbu senjata Anda ke depan dan arah dari senjata Anda ke target.
Biarkan W menjadi vektor maju senjata Anda.
Biarkan D menjadi arah dari senjata Anda ke target Anda. (Target.pos - Weapon.pos)
Jika Anda memecahkan formula produk titik
untuk alpha, Anda mendapatkan:
Anda hanya perlu mengubah radian ke derajat dan Anda punya sudut untuk memutar robot Anda. (Seperti yang Anda sebutkan senjata berada pada sudut ke robot Anda, jadi Anda perlu menambahkan sudut ke alpha)
sumber
Semua jawaban yang diposting sejauh ini (kurang lebih) salah, jadi inilah solusi cepat yang benar:
Untuk mengarahkan pistol ke target, putar vektor forward turret ke target dan tambahkan sudut θ.
Jadi mari kita cari θ:
Ketika
δ' = 0
ini disederhanakanθ = asin(a / d)
, yang cocok dengan bagian pertama dari jawaban John Hamilton.Edit:
Saya telah menambahkan contoh yang berfungsi.
Buka di JSFiddle atau gunakan cuplikan tertanam di bawah:
sumber