Cara membuat panah mendarat di posisi tertentu di ruang dunia 3D

8

Dalam permainan saya ketika saya mengklik dengan mouse di medan di suatu tempat, saya ingin pemain menembakkan panah ke posisi itu secara parabola.

Panah memiliki posisi, akselerasi dan kecepatan semua menggunakan vektor 3D. Saya melihat Lintasan artikel proyektil di wikipedia, tapi saya tidak tahu bagaimana menerapkannya dalam situasi saya karena menjelaskan matematika 2D. Saya bertanya-tanya apakah ada solusi untuk vektor 3D? Adakah sumber daya yang baik yang mungkin terkait dengan situasi 3D?

Nick
sumber
5
Saya tidak akan menulis ini sebagai jawaban karena saya berharap seseorang dapat memberikan respons yang lebih menyeluruh, tetapi Anda dapat menggunakan solusi 2D dalam 3D. Solusi 2D berlaku untuk bidang vertikal yang berjalan melalui titik awal dan akhir, sehingga Anda mengambil solusi 2D dan memutarnya untuk mencocokkan bidang itu dalam ruang 3D.
Kylotan

Jawaban:

12

Untuk memperluas komentar Kylotan, Anda dapat menggunakan rumus 2D dalam 3D. Dengan asumsi Y sudah habis:

menghitung posisi target dalam ruang X'Y'Z ', di mana sumbu X' sejajar dengan arah penerbangan panah, sumbu Y 'naik, dan Z' tegak lurus terhadap sumbu X 'dan Y'.

diagram

Setelah Anda menghitung X dan Y, Anda dapat mengonversi kembali ke ruang-XYZ yang sebenarnya

Contoh

Seorang pemanah berada di (1,0,1). Dia ingin menembakkan panah ke (4,0,5). Kami menganggap X 'sebagai vektor satuan (0,6, 0, 0,8) karena ia menunjuk langsung dari sumber ke titik tujuan. Kami kemudian menganggap Z 'menjadi (-0,8, 0, 0,6) karena itu adalah tegak lurus, tetapi karena panah tidak bergerak dalam sumbu Z', kami akan mengabaikannya. Masalah Anda sekarang adalah bagaimana menembak panah dari (0,0) hingga (0,5) di ruang X'Y '.

.. lakukan perhitungan 2D di sini. Perhatikan bahwa Anda mungkin ingin fungsi parametrik X 'dan Y' dalam hal t , variabel waktu.

Salah satu cara untuk abstrak konversi antara dua koordinat adalah dengan menggunakan matriks transformasi.

let archer = Vector3d(1.0,0.0,1.0)
let target = Vector3d(4.0,0.0,5.0)
let travel = target - archer
let transform = Matrix4d.CreateTranslation(-archer) *
                Matrix4d.CreateRotationY(Math.Atan2(travel.Z,travel.X)) 
Vector3d.Transform(archer, transform) // transforms archer to (0,0,0)
Vector3d.Transform(target, transform) // transforms target to (5,0,0)

ketika kita mengkonversi kembali dari X'Y'Z ' ke XYZ , ini hanyalah transformasi linear terbalik.

let inverse = Matrix4d.Invert(transform)
Vector3d.Transform(Vector3d.Zero, transform) // transforms (0,0,0) to (1,0,1)
Jimmy
sumber
Terima kasih, saya berhasil membuatnya bekerja! Masih mencari cara untuk membuatnya bekerja dengan ketinggian yang berbeda sekarang ... :)
Nick
Tidaaaak! Erm Ini dapat dipecahkan secara analitis dalam dimensi apa pun tanpa menggunakan perubahan koordinat atau trigonometri. Lihat Bagaimana menghitung akselerasi ketika mengarahkan proyektil? dan playtechs.blogspot.com/2007/04/aiming-at-moving-target.html untuk contoh.
Electro