Come far atterrare una freccia in una posizione specifica nello spazio del mondo 3D


8

Nel mio gioco quando clicco con il mouse sul terreno da qualche parte, vorrei che il giocatore lanciasse una freccia in quella posizione in modo parabolico.

La freccia ha una posizione, un'accelerazione e una velocità tutte usando i vettori 3D. Ho guardato la traiettoria di un articolo proiettile su Wikipedia, ma non so come applicarlo nella mia situazione in quanto spiega la matematica 2D. Mi chiedevo se esiste una soluzione per i vettori 3D? Qualche buona risorsa forse legata alla situazione 3D?


5
Non scriverò questa come risposta poiché spero che qualcuno possa dare una risposta più approfondita, ma è possibile utilizzare la soluzione 2D in 3D. La soluzione 2D si applica al piano verticale che attraversa il punto iniziale e finale, quindi si prende la soluzione 2D e la si ruota per adattarla a quel piano nello spazio 3D.
Kylotan,

Risposte:


12

Per espandere il commento di Kylotan, puoi usare le formule 2D in 3D. Supponendo che Y sia attivo:

calcola la posizione del bersaglio nello spazio X'Y'Z ', dove l'asse X' è parallelo alla direzione di volo della freccia, l'asse Y 'è su e Z' è perpendicolare agli assi X 'e Y'.

diagramma

Dopo aver calcolato X 'e Y', è possibile riconvertire in spazio XYZ reale

Esempio

Un arciere è a (1,0,1). Vuole lanciare una freccia su (4,0,5). Consideriamo X 'come vettore unitario (0.6, 0, 0.8) poiché punta direttamente dal punto sorgente a quello di destinazione. Quindi prendiamo Z 'per essere (-0,8, 0, 0,6) perché è una perpendicolare, ma poiché la freccia non si muove nell'asse Z', la ignoreremo. Il tuo problema ora è capire come scoccare una freccia da (0,0) a (0,5) nello spazio X'Y '.

.. fai calcoli 2D qui. Nota che probabilmente vorrai funzioni parametriche di X 'e Y' in termini di t , la variabile temporale.

Un modo per astrarre la conversione tra le due coordinate è usare una matrice di trasformazione.

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)

quando riconvertiamo da X'Y'Z ' a XYZ , questa è semplicemente una trasformazione lineare inversa.

let inverse = Matrix4d.Invert(transform)
Vector3d.Transform(Vector3d.Zero, transform) // transforms (0,0,0) to (1,0,1)

Grazie, sono riuscito a farlo funzionare! Sto ancora cercando di capire come farlo funzionare con diverse altezze ora ... :)
Nick,

Nooooo! Erm. Questo può essere risolto analiticamente in qualsiasi dimensione senza ricorrere al cambio di coordinate o trigonometria. Vedi Come spiegare l'accelerazione quando si mirano i proiettili? e playtechs.blogspot.com/2007/04/aiming-at-moving-target.html per esempi.
Electro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.