So landen Sie einen Pfeil an einer bestimmten Position im 3D-Weltraum

8

Wenn ich in meinem Spiel irgendwo mit der Maus auf das Gelände klicke, möchte ich, dass der Spieler parabolisch einen Pfeil auf diese Position abfeuert.

Der Pfeil hat eine Position, Beschleunigung und Geschwindigkeit, die alle 3D-Vektoren verwenden. Ich habe mir die Flugbahn eines Projektilartikels auf Wikipedia angesehen, weiß aber nicht, wie ich sie in meiner Situation anwenden soll, da sie die 2D-Mathematik erklärt. Ich habe mich gefragt, ob es eine Lösung für 3D-Vektoren gibt. Irgendwelche guten Ressourcen, die vielleicht mit der 3D-Situation zusammenhängen?

Nick
quelle
5
Ich werde dies nicht als Antwort schreiben, da ich hoffe, dass jemand eine gründlichere Antwort geben kann, aber Sie können die 2D-Lösung in 3D verwenden. Die 2D-Lösung gilt für die vertikale Ebene, die durch den Start- und Endpunkt verläuft. Nehmen Sie also die 2D-Lösung und drehen Sie sie, um sie an diese Ebene im 3D-Raum anzupassen.
Kylotan

Antworten:

12

Um Kylotans Kommentar zu erweitern, können Sie die 2D-Formeln in 3D verwenden. Angenommen, Y ist aktiv:

Berechnen Sie die Position des Ziels im X'Y'Z'-Raum, wobei die X'-Achse parallel zur Pfeilflugrichtung ist, die Y'-Achse nach oben zeigt und Z 'senkrecht zur X'- und Y'-Achse ist.

Diagramm

Sobald Sie X 'und Y' berechnet haben, können Sie zurück in den realen XYZ-Raum konvertieren

Beispiel

Ein Bogenschütze ist bei (1,0,1). Er will einen Pfeil auf (4,0,5) schießen. Wir nehmen X 'als Einheitsvektor (0,6, 0, 0,8), da es direkt von der Quelle zum Zielpunkt zeigt. Wir nehmen dann Z 'als (-0,8, 0, 0,6), weil es eine Senkrechte ist, aber da sich der Pfeil nicht in der Z'-Achse bewegt, werden wir ihn ignorieren. Ihr Problem besteht nun darin, herauszufinden, wie Sie einen Pfeil von (0,0) nach (0,5) im X'Y'-Raum abschießen.

.. hier 2D-Berechnungen durchführen. Beachten Sie, dass Sie wahrscheinlich parametrische Funktionen von X 'und Y' in Bezug auf t , die Zeitvariable, wünschen .

Eine Möglichkeit, die Konvertierung zwischen den beiden Koordinaten zu abstrahieren, besteht in der Verwendung einer Transformationsmatrix.

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)

Wenn wir von X'Y'Z ' nach XYZ zurückkonvertieren , ist dies einfach eine umgekehrte lineare Transformation.

let inverse = Matrix4d.Invert(transform)
Vector3d.Transform(Vector3d.Zero, transform) // transforms (0,0,0) to (1,0,1)
Jimmy
quelle
Danke, ich habe es geschafft, dass es funktioniert! Ich finde immer noch heraus, wie ich es jetzt mit verschiedenen Höhen zum Laufen bringen kann ... :)
Nick
Nooooo! Ähm. Dies kann in jeder Dimension analytisch gelöst werden, ohne dass Koordinaten oder Trigonometrie geändert werden müssen. Siehe Wie wird die Beschleunigung beim Zielen auf Projektile berücksichtigt? und playtechs.blogspot.com/2007/04/aiming-at-moving-target.html für Beispiele.
Electro