Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

1

24.02.2011, 15:21

differenziellen Updateformeln in "explizite" umwandeln

Hi,

folgender Algorithmus aktualisiert die Rotations eines Objektes (self). Dabei ist self.dtyp einfach eine Typenklasse, die bestimmte Eigenschaften speichert.

http://codepad.org/nJoEoqOq

Für den Fall, dass self.dtyp.rollcentervelocity genau Null ist, vereinfacht sich das ganze zu 3 seperate DGL der Form §\frac{d r(t)}{d t} = v_0§, welche einfach direkt per §r(t) = r_0 + v_0 * t§ gelöst wird.
Könnte man für den Fall self.dtyp.rollcentervelocity ungleich Null alle 3 Achsen getrennt getrennt betrachten, so dass die DGLs für yaw und pitch wie oben wären und für r sich die DGL §\frac{d r(t)}{d t} = v_0 - c_0 \cdot r(t)§ ergeben würden. Hier wäre die Lösung für r(t):
§r(t) = \left(r_0-\frac{v_0}{c_0}\right) \exp\left(-c_0 \cdot (t - t_0)\right)+ \frac{v_0}{c_0}§
Nun gibt es aber leider dieses hässliche quat2.setHpr((self.alphasupport * rot.getRight()[2],0,0)) in Kombination mit self.node.setQuat(quat1 * rot * quat2). Damit wird das ganze zu einem (irgendwie [erklär ich gleich]) gekoppelten System.

Meine Frage: hat jemand eine gute Idee wie man diesen Algo umschreiben oder das DGL-System lösen kann, so dass ich direkt aus rotation(t_0) die rotation(t) berechnen kann?
Ein möglicher Schritt zur Lösung des Problems ist in meinen Augen das self.node.setQuat(quat1 * rot * quat2) explizit auszudrücken um die Art der Kopplung erstmal festzustellen. kA ob es nicht ggf eine wunderbar einfache Näherung o.ä. gibt oder ob das ganze nur per Lösen des DGL systems geht.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Nox« (24.02.2011, 15:55)


Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

28.02.2011, 18:17

Okay das alte DGL System ist "ungültig". Das neue zu lösende ist:
http://codepad.org/MsKOBlnH
Also nicht wesentlich einfacher.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

3

01.03.2011, 00:15

hmmm. Also was genau ist rot? Das geht aus deiner Angabe nicht hervor. quat1 und quat2 sind quaternionen? Welche Rotationen stellen diese dar? getR liefert den alten roll-Winkel?

Ich versteh nicht genau, warum du das machst. Ich nehme an, du willst die Eulerwinkel für die Rotations des Objekts aktualisieren. Doch wenn du schon die absolute Rotation hast, und die relative dazu, warum rechnest du dann nicht einfach die neue absolute aus, und holst dir aus dieser die Eulerwinkel? (ich denk mal, dasses da irgendwo einen Grund gibt, warum du das nicht machst. Fände es hilfreich, wenn du erklären würdest, was genau du machen willst)
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

01.03.2011, 02:13

Ja. getR() liefert den alten Rollwinkel und rot ist die alte Rotation als quaternion. Der Grund ist einfach, dass ich bisher hoffte, dass ggf. einer mit einen Blick das Ganze vereinfachen kann. Außerdem bin ich mit Quaternions garnicht vertraut. Wie rechne ich denn die resultierenden Eulerwinkel am einfachsten und fehlerfreisten aus (ggf. sollte ich mir doch mathematica und konsorten mal anschauen)?
P.S: Leider verweigert Wolfram-alpha die Verarbeitung von
{{cos(c),-sin(c),0},{sin(c),sin(c),0},{0,0,1}} * {{cos(h_f),-sin(h_f),0},{sin(h_f),sin(h_f),0},{0,0,1}} * {{cos(r_f),0,sin(r_f)},{0,1,0},{-sin(r_f),0,cos(r_f)}} * {{1,0,0},{0,cos(p_f),-sin(p_f)},{0,sin(p_f),cos(p_f)}} * {{cos(h_i),-sin(h_i),0},{sin(h_i),sin(h_i),0},{0,0,1}} * {{cos(r_i),0,sin(r_i)},{0,1,0},{-sin(r_i),0,cos(r_i)}} * {{1,0,0},{0,cos(p_i),-sin(p_i)},{0,sin(p_i),cos(p_i)}}
Und dabei habe ich es noch nichtmal nach den Winkeln ansich gefragt...
(welche ich dann z.B. hiermit bekommen könnte: http://www.gregslabaugh.name/publications/euler.pdf )

Naja ich werde mich mal nach jemanden mit Mathematic umsehen müssen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

5

01.03.2011, 11:31

Also Mathematica spuckt für dein obiges Problem folgendes aus:
{{c cos^5 h_f h_i r_f r_i, 0, 0}, {0, c cos^2 sin^3 h_f h_i p_f p_i, 0}, {0, 0, cos^4 p_f p_i r_f r_i}}
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

01.03.2011, 11:37

Warum musst du eigentlich unbedingt mit Eulerwinkeln arbeiten?

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

01.03.2011, 14:45

@dot ne bessere Idee wie ich sonst die Winkelgeschwindigkeiten+Rücktreibende Wirkung auf 0° Rollen+Pitch durch Rollwinkel da mit reinbringe?

@Black-Panther danke!
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

8

01.03.2011, 15:02

Allerdings gibt es da bessere Lösungen. Du kannst direkt die zeitliche Ableitung des Quaternions aus der Winkelgeschwindigkeit berechnen.

dq/dt = 1/2 * q * w (local space)
oder
dq/dt = 1/2 * w * q (world space)

wobei w hier die Winkelgeschwindigkeit ist (aber in quaternion-darstellung --> also einfach realteil 0 und die 3 immaginärteile entsprechen xyz)

_________________________________________

zu dienem mathematica problem: Die Lösung für:
{{Cos[c], -Sin[c], 0}, {Sin[c], Sin[c], 0}, {0, 0,
1}}*{{Cos[h_f], -Sin[h_f], 0}, {Sin[h_f], Sin[h_f], 0}, {0, 0,
1}}*{{Cos[r_f], 0, Sin[r_f]}, {0, 1, 0}, {-Sin[r_f], 0,
Cos[r_f]}}*{{1, 0, 0}, {0, Cos[p_f], -Sin[p_f]}, {0, Sin[p_f],
Cos[p_f]}}*{{Cos[h_i], -Sin[h_i], 0}, {Sin[h_i], Sin[h_i],
0}, {0, 0, 1}}*{{Cos[r_i], 0, Sin[r_i]}, {0, 1, 0}, {-Sin[r_i],
0, Cos[r_i]}}*{{1, 0, 0}, {0, Cos[p_i], -Sin[p_i]}, {0,
Sin[p_i], Cos[p_i]}}

ist

{{Cos[c] Cos[h_f] Cos[h_i] Cos[r_f] Cos[r_i], 0, 0}, {0,
Cos[p_f] Cos[p_i] Sin[c] Sin[h_f] Sin[h_i], 0}, {0, 0,
Cos[p_f] Cos[p_i] Cos[r_f] Cos[r_i]}}
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Black-Panther« (01.03.2011, 15:23)


Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

01.03.2011, 15:42

Also es geht darum, dass ich ein Netzwerkspiel habe (Schleichfahrt reloaded), wo ein Objekt je nach Benutzereingaben (self.order) entsprechend seine Ausrichtung (linear mit der maximalen Winkelgeschwindigkeit) ändern kann. Außerdem erfährt ein Objekt was aus der Roll=0 Position ausgelenkt ist eine rücktreibende Wirkung Richtung Roll=0 (das ist der "r -= ..." Anteil). Außerdem dreht sich ein Objekt um die Z-Weltachse, wenn es "gerollt" ist (das ist der quat2 Anteil).

Iterative ist natürlich möglich allerdings muss der Client ggf viele Schritte nachholen, wenn die Daten "sehr alt" sind. Sprich da wäre ein expliziter Ausdruck praktisch.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige