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