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'.
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)