Seite 1 von 1

Re: Generierung einer Matrix anhand einer Ebene

Verfasst: 27.10.2017, 14:56
von joggel
Ich habe bis jetzt noch nicht weiter programmiert.
Was ich mir aber überlegt habe: soll sich denn der Up-Vector bei einer Bewegung durch die Röhre ändern?
Es soll doch Oben stets Oben sein; also kann doch der Up-Vector die ganze Zeit konstant bleiben. Oder liege ich da falsch? Was sich die ganze zeit über ändert ist doch der eye- und der center-vector...

Zu der frage nach dem stützvektor:
Ich habe leider eher geringe kentnisse im bereich linearer Algebra;
Ich dachte, das der Stützvektor lediglich die Position der Fläche im Raum definiert. Also in meinem Fall: Splinefunc(t).

Re: Generierung einer Matrix anhand einer Ebene

Verfasst: 27.10.2017, 19:52
von joeydee
Ok, das mit dem Stützvektor war dann ein Missverständnis. Das ist also die Position.
Nochmal die genauere Nachfrage: Wenn das mit den Kreisen nun geht, wie ermittelst du dort den fehlenden Vektor um die Matrix zu konstruieren?

Wenn der Up-Vektor global konstant bleibt (z.B. +y), kann es theoretisch den Fall geben, dass er irgendwann mit dem Eye-Vektor zusammenfällt (z.B. wenn der Spline senkrecht nach oben geht). Dann hast du einen Gimbal-Lock, ist nicht lösbar, die Ansicht kollabiert. Dasselbe wie bei den Kreisen.

Re: Generierung einer Matrix anhand einer Ebene

Verfasst: 28.10.2017, 08:19
von joggel
joeydee hat geschrieben:Ok, das mit dem Stützvektor war dann ein Missverständnis. Das ist also die Position.
Nochmal die genauere Nachfrage: Wenn das mit den Kreisen nun geht, wie ermittelst du dort den fehlenden Vektor um die Matrix zu konstruieren?
Ich habe von anfang an folgende Vektoren definiert:
- Front-Vector (=Normale der Ebene)
- Right-Vector (zeigt zur rechten Seite des Kreises)
- Up-Vector (zeigt nach Oben des Kreises)
- Position

Und diese berechne ich mir für jeden Kreis, nach deinem Vorschlag, neu und konstruiere daraus die Matrix.

Mein spontaner Gedanke ist, dass ich sowas dann auch bei der berechnung des Up-Vektors für die LookAt-Funktion machen kann.
Front-Vektor == Center-Vektor
Position == Eye-Vektor
Up-Vektor == Up-Vektor

Nur fehlt mir da der Right-Vektor, oder?
Ich könnte von Anfang an einen definieren, und daraus ständig die Parameter neu berechnen, so wie bei den Kreisen.
Diese Parameter müßte ich mir dann immer merken, und für jede neue Position neu berechnen.
Nur frage ich mich: gibt es denn da keinen einfacheren Weg?

Re: Generierung einer Matrix anhand einer Ebene

Verfasst: 28.10.2017, 10:52
von joeydee
Das geht in die richtige Richtung. Ich versuche nochmal die wesentlichen Punkte allgemein zusammenzufassen, das wirst du immr wieder brauchen, bei mir hat es irgendwann "Klick" gemacht.
- Eine Matrix für einen deiner Kreise zu berechnen und eine View-Matrix für die Kamera zu berechnen ist exakt dasselbe Problem.
- Um eine Matrix eindeutig definieren zu können, brauchst du eine Position und mindestens zwei Richtungen (als normalisierte Vektoren, möglichst schon senkrecht zueinander). Nur Position und eine Richtung (z.B. look-at == front) reicht nicht, es gibt unendlich viele Möglichkeiten daraus eine Matrix zu machen (rollend um den front-Vektor).
- Aus diesem Grund darf die zweite Richtung nie mit der ersten zusammenfallen, sonst gibt es einen Gimbal-Lock, es lässt sich keine Transformationsmatrix aufspannen.
- Die dritte notwendige Richtung ergibt sich aus dem Kreuzprodukt (X) der ersten beiden (z.B. right = front X up oder up = front X right)
- Waren die ersten beiden Richtungen nicht senkrecht zueinander, kann man sie mit dem Kreuzprodukt abschließend orthogonalisieren.
- Eine Matrix setzt sich aus den Spaltenvektoren right,up,front und position zusammen. Der jeweils 4. Eintrag in den Spalten ist 0,0,0,1 (letzte Zeile aus der 4x4 Einheitsmatrix) - s. vorherige Seite

Konkret auf deine Anwendung bezogen:
Kreisebene-Position = Splinepos = Ebenenpunkt = Eyepos
Kreisebene-Normale = (normalize(next Splinepos - akt. Splinepos)) = front = view = lokale Z-Richtung
Kreisebene-Y = up = lokale Y-Richtung
Kreisebene-X = right = lokale X-Richtung
(Alle Angaben in Weltkoordinaten, also untransformiert)

Die ersten beiden sind klar.
up und right sind von den gegebenen Bedingungen (Spline) grundsätzlich undefiniert.
Hat man einen, kann man den anderen per Kreuzprodukt definieren.

Du musst mindestens einen der fehlenden Vektoren beim Start definieren.

Eine Möglichkeit wäre also, den ersten up-Vektor zu definieren (z.B. Welt-Y 0,1,0) wenn man weiß dass der Spline immer in Welt-Z-Richtung startet. Knn er auch zufällig direkt in Y-Richtung starten, geht das nicht.
Für die nächste Position dann zuerst den up-Vektor der letzten Kamera nehmen, daraus den neuen right-Vektor bestimmen (newRight = oldUp X newFront), dann den up-Vektor korrigieren (newUp = newFront X newRight), dann hast du die neue Matrix beisammen.
Wenn du eine Look-At-Funktion aus einer Lib aufrufst mit jeweils dem alten Up-Vektor, wird diese sehr wahrscheinlich genau das machen.

Für mehr Kontrolle müsstest du einen zweiten Spline parallel zum ersten definieren, der jeweils die up-Richtung für eine bestimmte Position angibt. Und sicherstellen dass sich beide Splines nie schneiden (up wäre dann nämlich 0,0,0, und das ist gleichbedeutend mit einem Gimbal Lock)

Einen "einfachen" Weg, aus einem Spline eine immer eindeutige Up-Richtung zu bekommen, gibt es nicht.

Re: Generierung einer Matrix anhand einer Ebene

Verfasst: 28.10.2017, 17:14
von joggel
Danke!!!
Ja, brauch da evtl etwas übung, aber im allgemeinen bekomme ich schon ein besseres Verständniss für das thema, auch dank deiner ausführlichen erklärung. Danke :)

Ich habe mir überlegt, ich werde das mit der zweiten Spline umsetzen. Das erscheint mir eine elegante Lösung, und bietet zusätzlich noch Möglichkeiten den up-vector variabel zu halten. Also das die Spline, die den up-vector definiert, auch etwas um die andere Spline rollt... gefällt mir!!
THX!!