Ich habe zwei Objekte (Ziel und Spieler), beide haben Position (Vektor3) und Rotation (Quaternion). Ich möchte, dass sich das Ziel dreht und direkt auf den Spieler gerichtet ist. Das Ziel sollte, wenn es schießt, direkt auf den Spieler schießen.
Ich habe viele Beispiele für das Slerping mit dem Player gesehen, aber ich möchte keine inkrementelle Rotation. Nun, ich nehme an, das wäre in Ordnung, solange ich das Slerp zu 100% machen kann und solange es tatsächlich funktioniert.
Zu Ihrer Information: Ich bin in der Lage, die Position und die Rotation zu verwenden, um viele andere Dinge zu tun, und alles funktioniert großartig, bis auf dieses letzte Stück, das ich nicht herausfinden kann.
Codebeispiele werden in der Klasse des Ziels ausgeführt, Position = die Position des Ziels, Avatar = der Spieler.
BEARBEITEN
Ich benutze jetzt Maiks C # -Code, den er zur Verfügung gestellt hat, und er funktioniert großartig!
0*(rotation A) + 1*(rotation B)
- mit anderen Worten, Sie stellen nur die Rotation auf Rotation B auf dem langen Weg ein. Slerp dient nur zum Bestimmen, wie die Drehung zwischen den beiden Elementen aussehen soll (0% <x <100%).Antworten:
Es gibt mehr als eine Möglichkeit, dies zu tun. Sie können die absolute Ausrichtung oder die Drehung relativ zu Ihrem Avatar berechnen, dh Ihre neue Ausrichtung = avatarOrientation * q. Hier ist der letztere:
Berechnen Sie die Rotationsachse, indem Sie das Kreuzprodukt des Einheitsvorwärtsvektors Ihres Avatars und den Einheitsvektor vom Avatar zum Ziel nehmen, den neuen Vorwärtsvektor:
Berechnen Sie den Drehwinkel mit dem Skalarprodukt
Erstellen Sie die Quaternion mit rotAxis und rotAngle und multiplizieren Sie sie mit der aktuellen Ausrichtung des Avatars
Wenn Sie Hilfe beim Auffinden des aktuellen Vorwärtsvektors des Avatars benötigen, geben Sie den Wert für 1 ein.
BEARBEITEN: Die Berechnung der absoluten Orientierung ist tatsächlich etwas einfacher. Verwenden Sie als Eingabe für 1) und 2) den Vorwärtsvektor der Identitätsmatrix anstelle des Avatars. Und multipliziere es nicht mit 3), sondern verwende es direkt als neue Orientierung:
newRot = q
Wichtig zu beachten: Die Lösung weist zwei Anomalien auf, die durch die Art des Kreuzprodukts verursacht werden:
Wenn die Vorwärtsvektoren gleich sind. Lösung hier ist einfach die Identität Quaternion zurückzugeben
Wenn die Vektoren genau in die entgegengesetzte Richtung zeigen. Die Lösung besteht darin, das Quaternion mit der Aufwärtsachse des Avatars als Rotationsachse und dem Winkel von 180,0 Grad zu erstellen.
Hier ist die Implementierung in C ++, die sich um diese Randfälle kümmert. Das Konvertieren in C # sollte einfach sein.
EDIT: Korrigierte Version von Marc's XNA Code
quelle
newForward
rotAngle
rotAxis
und anreturned quaternion
. Der Code für den Mob ist derselbe, sobald wir ihn mit dem Avatar erstellt haben, ist es einfach, die Überschrift eines Objekts zu ändern.