Rotationsmatrizen, Quaternionen oder beides?

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Krishty »

Top-OR hat geschrieben:Dann hast du aber wieder das Prob, dass die meisten Libs mit Interfaces für Matrizen um die Ecke kommen. Dann musst du, wie beschrieben, kostenintensiv umrechnen.
(z.B. wenn du die Rot direkt nach OpenGL schieben willst)
Also, ich habe die Umrechnung von Quaternions zu Rotationsmatrizen eben überflogen und mir kommt sie überhaupt nicht kostenintensiv vor – keine 30 Vektoranweisungen, von denen zwei Drittel Shuffling sind und der Rest Addition, Multiplikation und Subtraktion. Kein sin() o.ä. und keine Abhängigkeiten zwischen den drei Ergebnisvektoren, also in der CPU-Pipeline astrein parallelisierbar.
Top-OR hat geschrieben:Edit: @Krishty - solche Effekte, wie du Sie beschreibst, hatte ich auch mal. Der Fehler lag in den Umrechungen zwischen Quaternion und Matrix. Da hab ich die lustigsten Effekte (Gummi) bekommen, da ich diese Rotationen bei skeletaler Animation beobachtet hatte: Das Model ist beim Drehen um sich selbst fast "bis zu 2D" plattgedrückt worden und wurde nach ein paar Grad weiterer Drehung "ganz fett". Vielleicht läuft deine Umrechnung irgendwo nicht sauber oder sowas?
Schrompf hat geschrieben:Ich hatte früher auch mit kollabierenden oder explodierenden Bones zu tun, wenn ich Quaternion-Animationen abgespielt habe. Die Probleme haben sich aber immer als Bug in der Matrix<->Quaternion-Umrechnung herausgestellt. Bzw. zu Teilen auch im Import der Daten. Hartnäckiges Debuggen heilt.
Ich benutze für die Sache momentan ausschließlich XNA Math; da ist keine einzige eigene Berechnung drin – aus genau diesem Grund …
Schrompf hat geschrieben:Alternativ kannst Du ja, wenn es nur um Kamera geht, manuell interpolieren. Du hast eine Kameratrafo am Start und eine am Ende. Du rechnest die Differenzmatrix aus, konvertierst die in eine Achse-Winkel-Darstellung und interpolierst nur noch den Winkel zwischen 0 und Ende. Ist im Endeffekt das gleiche wie eine Quaternion-Interpolation, nur halt mit alternativem Code. Die Matrix&Quaternion-FAQ müsste für alle Teilschritte fertigen Code bereithalten.
Jo … ich habe auch schon darüber nachgedacht, ob ich nicht einfach speziell bei der Kamera die Rotationswinkel speichere, interpoliere und aufgrund dessen dann Transformation berechne. So habe ich es vorher auch gemacht und es war wirklich perfekt. Aber mein Ziel war eigentlich, solche Daten durch die Trafo zu ersetzen … ach keine Ahnung; ich arbeite jetzt einfach ein paar Wochen ohne ruckartiges Umgucken, bis das neue System bereit ist.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Top-OR »

Krishty hat geschrieben:Also, ich habe die Umrechnung von Quaternions zu Rotationsmatrizen eben überflogen und mir kommt sie überhaupt nicht kostenintensiv vor – keine 30 Vektoranweisungen, von denen zwei Drittel Shuffling sind und der Rest Addition, Multiplikation und Subtraktion. Kein sin() o.ä. und keine Abhängigkeiten zwischen den drei Ergebnisvektoren, also in der CPU-Pipeline astrein parallelisierbar.
Sorry, ich hab mich unpräzise ausgedrückt - das ist ne Spezialität von mir ;-). Ich meine "kostenintensiv umrechnen" im Vergleich zu "für lau" - also "keiner Umwandlung".
Sicher gibts teurere Funktionen - z.B. eben die Winkelfunktionen. Wies um deren Laufzeitverhalten "genau" im Vergleich zu anderen üblich verdächtigen Funktionen aussieht, weiß ich nicht.
Ich kenne da keine genauen Benchmarks; ich peile da eher so übern Daumen.

Ich habe lediglich mal "gelernt" [bitte NICHT nach Sonnenschein oder Details fragen], dass die Dinger ja auch nur über ein (Tailor-[?])Polynom annähern - und das sind ja dann auch nur adds und muls (wenn auch "mehr"; deswegen "langsam").

Schrompf hat geschrieben: Alternativ kannst Du ja, wenn es nur um Kamera geht, manuell interpolieren. Du hast eine Kameratrafo am Start und eine am Ende. Du rechnest die Differenzmatrix aus, konvertierst die in eine Achse-Winkel-Darstellung und interpolierst nur noch den Winkel zwischen 0 und Ende. Ist im Endeffekt das gleiche wie eine Quaternion-Interpolation, nur halt mit alternativem Code. Die Matrix&Quaternion-FAQ müsste für alle Teilschritte fertigen Code bereithalten.
Auch ne Idee. Hätte nicht gedacht, dass das so "leicht" geht. Ich hätte da Angst, dass man sich verfriemelt.
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von dot »

Wie genau willst du denn deine Kamera bewegen? Für Kamerapfade find ich eigentlich Splines sehr angenehm...
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Krishty »

Top-OR hat geschrieben:Ich habe lediglich mal "gelernt" [bitte NICHT nach Sonnenschein oder Details fragen], dass die Dinger ja auch nur über ein (Tailor-[?])Polynom annähern - und das sind ja dann auch nur adds und muls (wenn auch "mehr"; deswegen "langsam").
Falls du damit die trigonometrischen Funktionen meinst: Unter x86 wird meist die FPU genutzt; unter x64 werden sie dann in den SSE-Einheiten per Taylorreihe angenähert. Die Laufzeit liegt beide Male bei durchschnittlich 100 Takten; plus Unkosten falls der Operand mehr als 2π von der Null weg ist oder man die dynamische C-Runtime linkt.

Was ich sagen will: Wenn man Quaternions benutzt, verbraucht die Quaternion-zu-Matrix-Konvertierung gut 30 Takte und man spart 2×16 Bytes, also eine halbe Cache-Zeile, deren Verfehlung einen u.U. weit über hundert Takte kosten könnte. Die Daten direkt parat zu haben muss also nicht zwangsweise immer schneller sein.

Aber für meinen Anwendungsfall komme ich mit Matrizen wohl viel besser klar … abgesehen von der verdammten Interpolation :/
dot hat geschrieben:Wie genau willst du denn deine Kamera bewegen? Für Kamerapfade find ich eigentlich Splines sehr angenehm...
Der User bewegt sie; ich glätte diese Bewegung nur … das müsste momentan sowas wie eine entartete Bézierkurve sein.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Top-OR »

Krishty hat geschrieben:Falls du damit die trigonometrischen Funktionen meinst: Unter x86 wird meist die FPU genutzt; unter x64 werden sie dann in den SSE-Einheiten per Taylorreihe angenähert. Die Laufzeit liegt beide Male bei durchschnittlich 100 Takten; plus Unkosten falls der Operand mehr als 2π von der Null weg ist oder man die dynamische C-Runtime linkt.
Was ich sagen will: Wenn man Quaternions benutzt, verbraucht die Quaternion-zu-Matrix-Konvertierung gut 30 Takte und man spart 2×16 Bytes, also eine halbe Cache-Zeile, deren Verfehlung einen u.U. weit über hundert Takte kosten könnte. Die Daten direkt parat zu haben muss also nicht zwangsweise immer schneller sein.
Gut zu wissen. Danke.
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Krishty »

Hmm … jetzt ist wiederholt so eine Art Gimbal Lock vorgekommen, wo nur noch eine Achse reagiert hat (und die ist dann auch gesprungen). Der Grund ist, dass meine Matrizen völlig degeneriert sind:

Code: Alles auswählen

-transformationB	{myMatrix={...} }	const Cric::math::TCTransformation<float> &
	-myMatrix	{myXNAMathMatrix={...} }	Cric::math::TCMatrix<float,4,4>
		-myXNAMathMatrix	{r=0x00000000002b4880 _11=-1.0255013e-014 _12=8.7156352e-022 ...}	_XMMATRIX
			-m	0x00000000002b4880	float [4][4]
				-[0]	0x00000000002b4880	float [4]
					[0]	-1.0255013e-014	float
					[1]	8.7156352e-022	float
					[2]	-9.1032874e-014	float
					[3]	0.00000000	float
				-[1]	0x00000000002b4890	float [4]
					[0]	9.1748244e-014	float
					[1]	-3.7365415e-014	float
					[2]	-1.0335805e-014	float
					[3]	0.00000000	float
				-[2]	0x00000000002b48a0	float [4]
					[0]	-3.7130492e-014	float
					[1]	-9.2328489e-014	float
					[2]	4.1826436e-015	float
					[3]	0.00000000	float
				-[3]	0x00000000002b48b0	float [4]
					[0]	0.00000000	float
					[1]	0.00000000	float
					[2]	0.00000000	float
					[3]	1.0000000	float
Ich darf die Normierung und Orthogonalisierung also schon jetzt in Angriff nehmen. :/
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von eXile »

Mir kommt es irgendwie so vor, als ob hier Quaternionen und Rotationsmatrizen als Gegensatz angesehen werden. Sind sie doch überhaupt nicht: Wenn man Quaternionen nicht braucht, kann man sie weglassen, wenn man sie für Interpolationen o.Ä. braucht, implementiert man sie eben.

Zum Thema Interpolation kann ich euch übrigens Suchen nach den Stichwörtern slerp, nlerp und log-lerp (für letzteres gibt es mehrere Begriffe) empfehlen. Der nlerp macht sich besonders für IK gut.

Und ich suche immernoch meinen fucking Link, wo die Vorzüge des double covers gezeigt werden.
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Top-OR »

Naja, was heißt Gegensatz - wie du schon sagst: Es führen eben mehrere Weg nach Rom.

Blond oder Brünett? Oder wie ich gern sage: Wein auf Bier, das rat ich dir; Bier auf Wein ... DAS RAT ICH DIR!
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Krishty »

Ich sehe das auch überhaupt nicht als Gegensatz – ich benutze ja bereits beides, indem ich für die Interpolation von Matrizen zu Quaternions und wieder zurück konvertiere. Warum ich nicht überall beides simultan haben will hat den Grund, dass ich zu faul bin, eine neue Quaternion-Klasse einzuführen, zu testen und mit XNA Math zu spezialisieren … und das nur für die doofe Interpolation, die vielleicht eh bald überflüssig ist.

Mit Renormierung der Rotationsmatrizen ist es jetzt augenscheinlich stabil; kein Haken und Springen mehr. Auch die Interpolation selber fühlt sich jetzt besser an, aber vielleicht ist das auch bloß Gewöhnung.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joeydee
Establishment
Beiträge: 1039
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von joeydee »

Krishty hat geschrieben:...wo man die Transformation eines Objekts hat und nun wissen will, wie viel Grad es gegenüber Norden rotiert ist, um das z.B. als Kompass auf dem HUD anzuzeigen.
Ich will nicht darauf herumhacken oder unbedingt das letzte Wort haben - ich erwähne das nur nochmal, weil es bei mir damals bei genau so einem Fall "Klick" gemacht hatte, wie elegant Vektoren und Matrizen gegenüber Winkelberechnungen doch sind...

Nehmen wir den Fall, dass du den Winkel für's HUD brauchst, und berechnest ihn mittels acos() aus dem Skalarprodukt. Was dann? Um den Endpunkt für die Zeigerlinie auf dem HUD-Kompass zu bekommen, rechnest du sowas wie ex=sin(winkel); ey=cos(winkel). Erst acos und dann cos? Nein, nimm doch einfach direkt die Koeffizienten aus der Matrix.
Und was, wenn du eine 2D-Sprite-Engine hast, die eine Zeigergrafik mittels Methode rotate(winkel) rotiert? Dann ist es eine schlechte 2D-Engine, wenn sie keine 2D-Matrizen erlaubt. Denn intern wird wieder was mit sin und cos gemauschelt, obwohl du die Werte schon fertig vorliegen hast. Und spätestens wenn die Sprites an die GPU geschickt werden, gibts ja doch wieder Matrizen - die könnte man eigentlich gleich bestücken. Ein paar mov's vs. Winkelberechnungen, da fällt doch die Entscheidung leicht...
Wie gesagt, der einzige denkbare Fall wäre die Anzeige des numerischen Werts. Nicht aber irgendwas, das mit Winkeldarstellung in einem kartesischen Koordinatensystem zu tun hat, da du sonst praktisch immer unnötige und doppelte Berechnungen machst.

Übrigens, so "interpoliere" ich z.B. eine Matrix zu einer Look-At-Lage (Anwendungsfall ist KI-Botsteuerung):
- der Look-At-Punkt wird mit der Inversen der Matrix multipliziert ("wo ist der Zielpunkt von der Matrix aus gesehen?")
- die Achsabschnitte des transformierten Punktes (x,y,z) geben mir direkt die Rotationsrichtung (z.B. x<0 --> nach links drehen) sowie ein Maß für den Rotationsabstand an (kein Winkel, aber genauso brauchbar, falls überhaupt benötigt)
- durch Addition/Subtraktion eines entsprechenden Beschleunigungswertes zur aktuellen Rotationsgeschwindigkeit (und dabei Prüfen/Einhalten der individuellen Bewegungsmöglichkeiten) lässt sich damit ein ziemlich natürliches Bewegungsverhalten mit einfachsten Berechnungen simulieren, vor allem dann wenn sich der Zielpunkt bewegt.
- eine fest definierte Endlage und -zeit und somit einen festen Weg gibt es bei mir nicht, nur Ziele und Einschränkungen. Der Weg dorthin entwickelt sich. Wie im richtigen Leben halt ;-)
Lineare Interpolation - damit stelle ich mir das in meinem Fall sogar unschöner bzw. komplizierter vor.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Krishty »

joeydee hat geschrieben:Ich will nicht darauf herumhacken oder unbedingt das letzte Wort haben
Kriegst du auch nicht; meins! ;)

Wir sprechen von unterschiedlichen Dingen. Bei HUD und Kompass musste ich zuerst an sowas denken:
comp1.png
comp2.png
Also tatsächlich die reine Zahlendarstellung. Wenn du hingegen sowas machen willst:
comp4.png
comp3.png
Dann ist alles außer Vektor- und Matrizenrechnung Wahnsinn, da gehe ich völlig konform.
joeydee hat geschrieben:Übrigens, so "interpoliere" ich z.B. eine Matrix zu einer Look-At-Lage (Anwendungsfall ist KI-Botsteuerung):
Ja; ich benutze es, wie gesagt, um die Bewegungen des Betrachters zu glätten indem ich eine virtuelle Transformation habe, die 1:1 dem User-Input entspricht, und sich die tatsächliche Transformation per linearer Interpolation mit 99,999 %/s an die virtuelle annähert. Bei Interpolation der Euler-Winkel war das perfekt; mit Matrizen-Quaternions-slerp()-Matrix kann ich jetzt, wo ich die Transformation regelmäßige renormiere und orthogonalisiere, keinen Unterschied feststellen (außer, dass extrem schnelle Schwenks mit mehreren Umdrehungen pro Frame nicht mehr gehen). Bei Bot-Steuerung oder Bone-Animation muss ich (zum Glück) noch nichts interpolieren.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Krishty »

Aus aktuellem Anlass habe ich mal überschlagen, was Matrizen, Quaternionen mit Vektoren, und Duale Quaternionen kosten:

• 3×4-Matrizen kosten 12 Skalare im Speicher (drei kann man im Tausch gegen ein Kreuzprodukt sparen).
Die Transformation eines 3D-Punkts durch eine Matrix kostet 9 Multiplikationen und 12 Additionen (21 insgesamt).
Die Verkettung (Matrix-Matrix-Multiplikation) kostet 36 Muls und 27 Adds (63).

• Quaternionen mit Versatzvektor kosten 7 Skalare im Speicher (einen kann man im Tausch gegen eine Quadratwurzel sparen).
Die Transformation eines 3D-Punkts durch ein Quaternion kostet 24 Muls und 20 Adds (44).
Die Verkettung (Quaternion-Quaternion-Multiplikation, Transformation des Versatzes, Addition des Versatzes) kostet 40 Muls und 32 Adds (72).

• Dual Quaternionen kosten 8 Skalare im Speicher (einen kann man im Tausch gegen eine Quadratwurzel sparen; wie es mit der 1 in der Translation aussieht, weiß ich nicht).
Um die Transformation durchzurechnen hatte ich keine Zeit.
Die Verkettung (drei Quaternion-Quaternion-Multiplikationen, eine Quaternion-Addition) kostet 88 Muls und Adds insgesamt. Ich weiß nicht, ob man das auf 80 vereinfachen kann, weil der Realteil der Translation immer 1 ist. Überhaupt sollte jemand mit Ahnung von der Materie durchrechnen, wie weit man es drücken kann.

Kann jemand diese Zahlen bestätigen, in der Luft zerreißen, …?!
Zur Erinnerung: Skalierung, Spiegelung und Scherung spielen für mich keine Rolle.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Krishty »

Wenn man diesem Artikel glaubt, ändern sich die Kosten von Quaternionen mit Versatzvektoren (ich habe die Verdopplung mal als Addition gezählt statt als Multiplikation):

Die Transformation eines 3D-Punkts durch ein Quaternion kostet 15 Muls und 15 Adds (30).
Die Verkettung kostet damit 30 Muls und 30 Adds (60).

Damit ist die Verkettung schonmal geringfügig günstiger als bei Matrizen … die Transformation selber kostet aber immernoch deutlich mehr. Für duale Quaternionen müsste es ähnliche Optimierungen geben, aber so weit bin ich noch nicht.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Krishty »

Kann mir jemand sagen, ob ich das richtig verstanden habe? Die Menge der Bezeichner ist auf diesem Gebiet einfach erdrückend … insbesondere passen die bijektiven Abbildungen irgendwie nicht in die Hierarchie.
Die Informationsmenge, die man zur Artikulation einer Abbildung braucht, sinkt von oben nach unten – dementsprechend steigt auch die Redundanz, wenn man immer alles durch Matrizen darstellt (für eine Parallelverschiebung im 3D-Raum braucht man nur drei Skalare; nicht die 16 einer 4×4-Matrix, die auch eine Schrägspiegelung ausdrücken könnten). Darüber hinaus sinkt auch der Rechenaufwand – weiß ich, dass meine Matrix eine eigentliche Bewegung repräsentiert, ist die Invertierung zehn Mal schneller als wenn sie jede affine Abbildung repräsentieren könnte.

Ich versuche gerade, zu identifizieren, welche Teile meiner Programmlogik welche Menge von Abbildungen voraussetzen und dann maßgeschneiderte Datenstrukturen einzusetzen.
Zuletzt geändert von Krishty am 27.12.2011, 14:11, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von dot »

Eine bijektive Abbildung ist nicht notwendigerweise linear. Eine lineare Abbildung ist genau dann bijektiv wenn ihre Abbildungsmatrix regulär ist (eine Inverse hat).
Eine Verschiebung ist nicht linear.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Krishty »

dot hat geschrieben:Eine Verschiebung ist nicht linear.
Du meinst, keine lineare Abbildung? Sie lässt sich aber doch als Komposition von Spiegelungen ausdrücken, und Spiegelungen sind linear – das ist sogar das erste Beispiel im Wikipedia-Artikel. Weiterhin
http://de.wikipedia.org/wiki/Verschiebung hat geschrieben:Parallelverschiebungen gehören zu den Bewegungen, da bei ihrer Anwendung Längen und Winkel erhalten bleiben. Als Bewegungen werden sie – vor allem die Parallelverschiebungen in der Ebene – auch zu den Kongruenzabbildungen gezählt.
http://de.wikipedia.org/wiki/Kongruenzabbildung hat geschrieben:Kongruenzabbildungen sind spezielle Ähnlichkeitsabbildungen, noch allgemeiner gehören sie zu den Affinitäten.
http://de.wikipedia.org/wiki/Affine_Abbildung#Definition hat geschrieben:Eine Abbildung f: A -> B zwischen affinen Räumen (A,VA) und (B,VB) heißt affine Abbildung, wenn es eine lineare Abbildung zwischen den zugehörigen Vektorräumen gibt, so dass […]
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von dot »

Krishty hat geschrieben:
dot hat geschrieben:Eine Verschiebung ist nicht linear.
Du meinst, keine lineare Abbildung? Sie lässt sich aber doch als Komposition von Spiegelungen ausdrücken, und Spiegelungen sind linear – das ist sogar das erste Beispiel im Wikipedia-Artikel.
Das Beispiel zeigt den Spezialfall einer Spiegelung an einer Koordinatenachse. Würd mich sehr interessieren wie du eine Verschiebung aus solchen Spiegelungen zusammenbaust ;)

Angenommen eine Verschiebung f(x) = x + t wäre linear. Dann müsste sie das Superpositionsprinzip erfüllen:
f(a * x + b * y) = a * f(x) + b * f(y)
Setzen wir mal ein:
f(a * x + b * y) = a * x + b * y + t = a * f(x) + b * f(y) = a * (x + t) + b * (y + t)
t = (a + b) * t
Widerspruch
q.e.d.

Affine Transformationen im Allgemeinen und Verschiebungen im Speziellen lassen sich über den Trick mit den homogenen Koordinaten als lineare Abbildungen darstellen. Dort erkauft man sich die Linearität aber durch erweitern des Problems um eine Dimension. Im R³ ist eine Translation aber nicht linear, denn sonst würde eine 3x3 Matrix reichen. Die Rücktransformation von homogenen Koordinaten in den R³ ist nicht linear!
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von Krishty »

Jetzt verstehe ich – dazu passt, dass sich eine affine Abbildung immer auch aus einer linearen Abbildung und einer Parallelverschiebung zusammensetzen lässt, wobei letztere dann natürlich keine lineare Abbildung sein kann. Also fliegen die linearen Transformationen schonmal komplett raus; damit passt die Bijektivität nun auch harmonischer. Danke!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Rotationsmatrizen, Quaternionen oder beides?

Beitrag von dot »

Krishty hat geschrieben:Jetzt verstehe ich – dazu passt, dass sich eine affine Abbildung immer auch aus einer linearen Abbildung und einer Parallelverschiebung zusammensetzen lässt, wobei letztere dann natürlich keine lineare Abbildung sein kann.
Exakt. In homogenen Koordinaten lassen sich affine Abbildungen als lineare Abbildung beschreiben (sonst könnte man sie nich mit Matritzen ausdrücken, denn eine Matrix ist äquivalent einer linearen Abbildung; jede Matrix beschreibt eine lineare Abbildung und jede lineare Abbildung lässt sich durch eine Matrix beschreiben), aber homogene Koordinaten sind ein projektiver Raum und kein normaler R³. Und die Rücktransformation von homogenen Koordinaten in den R³ (die berühmte Homogenisierung/Division durch w) ist keine lineare Abbildung und erst recht nicht bijektiv (kann gar nicht sein, da ja eine Dimension verloren geht).
Krishty hat geschrieben:Also fliegen die linearen Transformationen schonmal komplett raus; damit passt die Bijektivität nun auch harmonischer. Danke!
Naja, eine Rotation/Skalierung ist z.B. eine lineare Transformation (für die reicht auch eine 3x3 Matrix ;) ). Aber die Teilmengenrelation zwischen bijektiven und linearen Abbildungen stimmte so einfach nicht. Es gibt bijektive lineare Abbildungen. Aber nicht jede lineare Abbildung ist bijektiv und schon gar nicht ist jede bijektive Abbildung linear. Es gibt also die Schnittmenge der bijektiven linearen Abbildungen, das sind eben genau die, die eine Inverse besitzen, aber das wars.
Antworten