Generierung einer Matrix anhand einer Ebene

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.

Generierung einer Matrix anhand einer Ebene

Beitragvon joggel » 25.10.2017, 08:06

Guten Morgen,

ich stehe vor einem kleinen Problem. Ich habe das schon mal im IRC angesprochen, aber die Lösung hat da nicht funktioniert, oder ich habe sie nicht verstanden.

Es geht um einen "Tunnelflug". Ich nmöchte durch einen Tunnel fliegen, der seine Richtung (samt Biegungen und so) entlang einer Spline ständig ändert.
Einen Tunnel generiere ich ja aus zB 2 Kreisen deren Vertices ich dann verbinde.

Wie ich vorgehen möchte:
Ich berechne die KreisVertices auf einer Ebene (zB eine Ebene die zwischen der Y- und X-Achse aufgespannt wird) und jage dann diese Vertices durch eine Matrix, die eine Translation und Rotation im 3D-Raum beschreibt

Es geht mir also vlt eher darum, wie ich eine Matrix generiere, die ich durch eine Fläche im Raum beschreibe.

Wie gesagt, ich möchte Punkte entlang einer Spline (3D) berechnen (wie das geht weiß ich).
Und an jedem dieser Punkte wird eine Fläche aufgespannt. Anhand dieser Fläche generiere ich eine Matrix (transformation + rotation).
Dann berechne ich Kreisvertices, die ich eben mit dieser Matrix multipliziere, damit die neuen Kreisvertices auf der Ebene landen.

Ich hoffe ich konnte mein Problem verständlich darlegen.
Wie würdet ihr dabei vorgehen?


Achso... ich benutze ja OpenSceneGraph. Dort kann ich Matrizen sehr leicht durch Rotation bzw Translation bzw Scalierung generieren.
bspw:
Code: Ansicht erweitern :: Alles auswählen

osg::Matrix matrix = osg::Matrix::identity();
matrix = matrix * osg::Matrix::rotate(osg::Quat(osg::DegreesToRadians(90.0), osg::Vec3(0, 0, 1))) * osg::Matrix::translate(x,y,z);


Also, es würde mir helfen wenn ich solche Parameter bekommen würde.
Also den Rotationswinkel, die Achse um die rotiert werden soll, und den translationsVektor (wobei der ja eher einfach zu ermitteln ist).


Gruß
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon smurfer » 25.10.2017, 09:19

Hi,

ich bin tatsächlich nicht sicher, ob ich dein Problem verstanden habe. Falls ja: kannst Du aus Deiner Splinerepräsentation nicht an den Stellen, an denen Du Kreis-Vertices erzeugen möchtest, die tangentialen Vektoren nehmen und zwischen je zwei aufeinander folgenden Vektoren die Rotationsmatrix berechnen?

Grüße, smurfer

p.s.: Mal auf die Schnelle als Ansatz gesucht, ohne zu wissen, ob es genau für dich zutrifft:
Rotationsmatrix, Vektoren: https://stackoverflow.com/questions/23166898/efficient-way-to-calculate-a-3x3-rotation-matrix-from-the-rotation-defined-by-tw
Tangentialvektor, Splines https://math.stackexchange.com/questions/1270776/how-to-find-tangent-at-any-point-along-a-cubic-hermite-spline#1272117
smurfer
 
Beiträge: 57
Registriert: 25.02.2002, 15:55

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joggel » 25.10.2017, 11:15

Danke smurfer. Ich werd mir die Links mal anschauen.

Ich werde auch mal eine Skizze zu hause machen, um mein Vorhaben zu verdeutlichen
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joggel » 25.10.2017, 11:22

Also mal so zwischendurch:

Ich möchte mir Flächen definieren entlang einer spline.
Diese Flächen haben einen Normalvektor und einen Stützvekor.
Dann möchte ich auf diesen Flächen Kreise zeichnen....

@smurfer
Was ist ein Tangent in diesem zusammengang?
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joeydee » 25.10.2017, 11:53

Dein Hauptproblem ist vermutlich, eine Ebene hat eine Definition zu wenig für eine eindeutige Matrix. Du hast Position und Normale, aber es fehlt eine definierte Richtung auf der Ebene selbst. Es gibt beliebig viele Matrizen, bei denen z.B. "z" mit der Normalen übereinstimmt, und x/y irgendwo auf der Ebene liegen (rotationssymmetrisch um z).
Du musst also beim Startpunkt des Splines auch einen lokalen "right"- und "up"-Vektor festlegen, welche zu der Startrichtung (die Normale zum nächsten Punkt) senkrecht stehen. Zumindest eine Richtung definieren, die andere ergibt sich dann aus dem Kreuzprodukt.
Oder ist das schon dein "Stützvektor"?

Dann:
- Berechne von einem Punkt zum nächsten die neue Ebenennormale ("front"-Vektor, so weit warst du sicher schon),
- Kreuzprodukt der Normalen mit dem alten right-Vektor ergibt den neuen up-Vektor,
- Kreuzprodukt der Normalen mit dem neuen up-Vektor ergibt den neuen right-Vektor.
(Das funktioniert nur, wenn du sicherstellen kannst, dass von Punkt zu Punkt keine 90-Grad-Wendungen auftreten und so der alte up- oder right-Vektor mit der neuen Richtung exakt zusammenfallen könnte - das wäre ein Gimbal Lock und das Kreuzprodukt würde keine brauchbaren Vektoren ausspucken).

Deine 4x4-Matrix für deine x/y-Ebene ergibt sich dann aus den berechneten Vektoren und der Punktposition:
right.x | up.x | front.x | pos.x
right.y | up.y | front.y | pos.y
right.z | up.z | front.z | pos.z
0 | 0 | 0 | 1

Irgendwelche Rotationswinkel rausrechnen um damit eine neue Matrix zu generieren würde sich intern in den Berechnungen übrigens aufheben (cos(acos(x)), das sollte man also lassen.
joeydee
Establishment
 
Beiträge: 497
Registriert: 23.04.2003, 15:29

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joggel » 25.10.2017, 12:07

Danke joey.

Soweit wurde mir das im IRC auch schon vermittelt, glaube ich.
Na ich werds mal versuchen umzusetzen.
Falls es klappt, oder auch nicht, melde ich mich hier noch mal...

Noch eine Frage:
"Upvector" == Normalvector der Ebene?
Ach nein. Du schriebst ja: Normalvektor, up- und right-Vektor...
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon smurfer » 25.10.2017, 12:16

joggel hat geschrieben:@smurfer
Was ist ein Tangent in diesem zusammengang?

Die Tangente, bzw. der repräsentierende Vektor. Die Tangente ist die Gerade, die an einem Punkt die gleiche Steigung wie in Deinem Fall dein Spline hat und somit 90° zur Normalen steht. Der Vektor ist gewissermaßen in Tunnelflugrichtung orientiert und entspricht der Ebenennormale. Aus zwei solcher Vektoren ließe sich die entsprechende Rotation berechnen.

Alternativ oder wenn Du explizit über Ebenen gehen möchtest, siehe Antwort von joeydee. Sein erster Schritt entspricht im weitesten Sinne der Tangente (bzw. einer Tangente zwischen den Punkten).

Grüße, smurfer
smurfer
 
Beiträge: 57
Registriert: 25.02.2002, 15:55

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joeydee » 25.10.2017, 12:49

joggel hat geschrieben:Danke joey.
Noch eine Frage:
"Upvector" == Normalvector der Ebene?
Ach nein. Du schriebst ja: Normalvektor, up- und right-Vektor...


Ja, nach der Beschreibung die du gegeben hast (Kreis in x/y-Ebene soll zu einem Tunnelsegment werden): Kreisebene-z == front == Ebenennormale; Kreisebene-x zeigt zur rechten Wand im Tunnel (right), Kreisebene-y zur Decke (up).
joeydee
Establishment
 
Beiträge: 497
Registriert: 23.04.2003, 15:29

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon smurfer » 25.10.2017, 12:52

joeydee hat geschrieben:Irgendwelche Rotationswinkel rausrechnen um damit eine neue Matrix zu generieren würde sich intern in den Berechnungen übrigens aufheben (cos(acos(x)), das sollte man also lassen.

War das auf meinen Beitrag bezogen? Falls ja, kann gut sein (in dem Fall ignorier, was ich geschrieben habe, Joggel), war nur eine spontane Idee ohne groß drüber nachzudenken. Würde mich dennoch interessieren, was Du meinst, konnte ich nicht ganz zuordnen.
smurfer
 
Beiträge: 57
Registriert: 25.02.2002, 15:55

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joeydee » 25.10.2017, 13:42

Neinnein :) das war joggel's ursprüngliche Anfrage, da er Funktionen für Matritzen aus Rotationswinkeln in seiner Lib vorliegen hat (erster Post, letzter Absatz). Aber die braucht man ja gar nicht.
joeydee
Establishment
 
Beiträge: 497
Registriert: 23.04.2003, 15:29

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joggel » 25.10.2017, 14:04

Ja, ich hatte das ja vor mit Rotationswinkel zu berechnen.

Aber nochmal zur Vollständigkeit und zu meinem Verständniss (@smurfer):
Wie würde denn die Herleitung einer solchen Matrix aussehen, wenn ich 2 dieser Tangentialvektoren hätte?
Und was wären die beiden Vektoren. Einer wäre ja der Normalvektor der Fläche, oder?
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joggel » 26.10.2017, 12:53

Ich stehe wieder vor einem Problem!

Das generieren der Röhre funktioniert schon sehr gut.
Nun möchte ich die Camera durch diese Röhre bewegen. Also auf genau der selben Spline.
Um die Camera auszurichten brauche ich ja eine Position (Eye-Vector), einen Referenzpunkt auf den ich schaue (Center-Vector) und einen Vektor der angibt wo Oben ist (up-Vektor).

Ich habe absolut keine Idee wie ich das umsetzen kann.

Im Prinzip müßte es ja genauso wie mein vorheriges Problem, mit den Flächen, zu behandeln sein, oder?
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joeydee » 26.10.2017, 14:24

Ja. Position und 3 Richtungsvektoren (oder 2, der dritte ergibt sich immer aus dem Kreuzprodukt) ergeben direkt deine Kamera-Matrix (View-Matrix). Ist dasselbe wie deine Transformationsmatrix oben, nur an getweenten Spline-Punkten.
Im Prinzip kannst du einfach mit der ersten Ebene (t=0 auf dem Spline) als View-Matrix starten, die Kamera auf dem Spline entlangbewegen und immer einen LookAt auf den Splinepunkt bei t+1 durchführen. Die Kamera wird sich nicht unbedingt "upright" verhalten, aber falls das egal ist, würde ich diesen Weg ausprobieren.
Hast du eine LookAt-Funktion in der Lib?
joeydee
Establishment
 
Beiträge: 497
Registriert: 23.04.2003, 15:29

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joggel » 26.10.2017, 14:44

Ja, eine LookAt-Funktion bietet mir osg.

Bisher habe ich das ja auch gemacht.
Also den Eye-Vector = SplineFunc(t).
Den Center-Vector = SplineFunc(t+0.1) zB.
Mir fehlt halt lediglich der Up-Vector.
Wobei ich aber sagen muss, das die Kamerafahrt dadurch sehr "unruhig" wird.
Aber okay, es kann auch sein, weil ich die Spline-Kontrollpunkte sehr sehr ungünstig errechnet habe.
Ich habe eine Gerade definiert, und entlang dieser geraden habe ich dann immer per rand() eine Abweichung von der Geraden berechnet, wo dann der Splinekontrollpunkt liegt. Ist vlt nicht ganz soooo günstig.
Mal sehen ob mir da etwas "harmonischeres" einfällt...

Aber zurück:
Mir fehlt da eigentlich nur der Up-Vector...
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Generierung einer Matrix anhand einer Ebene

Beitragvon joeydee » 26.10.2017, 18:14

Probier mal den Up-Vektor der alten View-Matrix. Normalerweise wird im LookAt die Matrix wieder orthogonalisiert.
Wenn du nicht beliebig rollen willst: wie hattest du den Stützvektor für deine Ebenen berechnet? Kannst du das für die Kamera ebenso machen?
joeydee
Establishment
 
Beiträge: 497
Registriert: 23.04.2003, 15:29

Nächste

Zurück zu Algorithmen und Datenstrukturen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste