Pitch,Yaw,Roll zu X,Y,Z Rotation (bei Camera,Entity)

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
FosJonas
Beiträge: 121
Registriert: 12.11.2008 19:31

Pitch,Yaw,Roll zu X,Y,Z Rotation (bei Camera,Entity)

Beitrag von FosJonas »

Hallo,

Es geht um folgendes: Entities und Cameras kann ich mittels RotateEntity bzw, RotateCamera mittels X,Y und Z Wert rotieren, will ich aber die aktuellen Rotationswerte bekommen geht das nur mittels Pitch Yaw und Roll, die ich allerdings nicht einfach wieder als Parameter für RotateEntity nutzen kann, da es ganz andere Werte sind als die die ich zuvor eingegeben habe.

Ich habe jetzt ein bisschen gegoogelt und es soweit verstanden das es einfach 2 verschiedene Varianten sind für eine Rotation im 3D Raum.

Was ich mich jetzt aber Frage, wie bekomme ich es hin meine Kamera Rotation an die eines Entities anzupassen? Irgendwie habe ich nichts gefunden was eine art "Umrechnung" ermöglicht.

Ein Beispiel (das so eben nicht funktioniert):

Code: Alles auswählen

RotateCamera(#Camera,EntityPitch(#Entity),EntityYaw(#Entity),EntityRoll(#Entity),#PB_Absolute)
Kann mir da jemand weiterhelfen? Wäre sehr dankbar.
Purebasic 5.10 | Kubuntu 12.04 (64 bit) | Opera 12.01 | Nvidia GT 9800
Xubuntu 12.04 (64 bit) | Intel HD Graphis (Onboard)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Pitch,Yaw,Roll zu X,Y,Z Rotation (bei Camera,Entity)

Beitrag von STARGÅTE »

Was du machen kannst ist, jetzt mit den neuen Befehlen: EntityDirectionX/Y/Z die "Guckrichtung" zu ermitteln.
Diese kannst du dann (addiert mit der Camera-Position) an das CameraLockAt übergeben.

Edit: Ich stehen aber vor ähnlichen Problemen. Da für X,Y,Z oder Pitch, Yaw, Roll immer eine Reihenfolge definiert werden muss.
Für mich als Mathematiker wäre es eindeutiger "überall" mit Rotationsmatrizen zu rechnen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Pitch,Yaw,Roll zu X,Y,Z Rotation (bei Camera,Entity)

Beitrag von DarkDragon »

STARGÅTE hat geschrieben:Was du machen kannst ist, jetzt mit den neuen Befehlen: EntityDirectionX/Y/Z die "Guckrichtung" zu ermitteln.
Diese kannst du dann (addiert mit der Camera-Position) an das CameraLockAt übergeben.
Fehlt da nicht noch eine Information ;-) ? Immerhin kann man die Kamera ja noch um diesen Richtungsvektor rotieren :doh: . Ein Up-Vektor fehlt noch. Momentan ist es praktisch unbestimmbar.
STARGÅTE hat geschrieben:Edit: Ich stehen aber vor ähnlichen Problemen. Da für X,Y,Z oder Pitch, Yaw, Roll immer eine Reihenfolge definiert werden muss.
Für mich als Mathematiker wäre es eindeutiger "überall" mit Rotationsmatrizen zu rechnen.
Das wäre für die meisten auch die gängige Vorgehensweise. Oder zumindest ein Quaternion, ein Skalierungs- und ein Translationsvektor.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: Pitch,Yaw,Roll zu X,Y,Z Rotation (bei Camera,Entity)

Beitrag von gnasen »

Ich bin mir nicht sicher, ob in PB ein links- oder rechtshändig gedrehtes Koordinatensystem genutzt wird.. Aber für den Fall linkshändig habe ich das schonmal ausgerechnet, siehe folgenden Post.
Das ganze war für direct3D, ändert aber nichts an den Rechnungen. Das Kernstück ist aufjedenfall folgende Formel:

Code: Alles auswählen

theta.f = ATan2(Matrix\_33,Matrix\_31)+#PI
phi.f = ATan2(Sin(theta)*Matrix\_31+Cos(theta)*Matrix\_33, -Matrix\_32)
ksi.f = ATan2(Cos(theta)*Matrix\_11-Sin(theta)*Matrix\_13,-Cos(theta)*Matrix\_21+Sin(theta)*Matrix\_23)
Das ganze dann als Yaw-Pitch-Roll oder Roll-Pitch-Yaw übergeben. Ich glaube ersteres, aber einer von beiden ist es auf jedenfall.

Edit: Ich wollte ein Bsp für PB bauen, aber es scheint nicht möglich zu sein das Koordinatensystem des Entitys zu erhalten. schade.
pb 4.51
Benutzeravatar
FosJonas
Beiträge: 121
Registriert: 12.11.2008 19:31

Re: Pitch,Yaw,Roll zu X,Y,Z Rotation (bei Camera,Entity)

Beitrag von FosJonas »

Also scheint es keine einfache Lösung zu geben,
da werde ich wohl einfach auf mein Workarround zurückgreifen und die Rotierungswinkel in Variablen zwischenspeichern.
Also so:

Code: Alles auswählen

RX = 90
RY = 45
RZ = 30
RotateCamera(#Camera,RX,RY,RZ,#PB_Absolute)
RotateEntity(#Entity,RX,RY,RZ,#PB_Absolute)
Und Gnasens Ansatz scheint irgendwie zu hoch für mich zu sein, die Formel versteh ich irgendwie gar nicht.
Purebasic 5.10 | Kubuntu 12.04 (64 bit) | Opera 12.01 | Nvidia GT 9800
Xubuntu 12.04 (64 bit) | Intel HD Graphis (Onboard)
Antworten