Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jun 16, 2024 01:00

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Rotation um beliebige Achse
BeitragVerfasst: Mo Aug 02, 2010 21:33 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
Hallooo!
In dem WebGL Tutorial von T.Giles http://learningwebgl.com/blog/?p=1253 (ganz weit unten) wird die Rotation um eine beliebig im Raum definierte Achse beschrieben. Dabei verwendet der Autor einfch eine Matrix, die alle bisherigen Rotationen um die x- und y-Achse mit sich trägt und bei jeder Drehung mit der restlichen mvMatrx multipliziert wird. Das funktioniert auch für meine Applikation zwar wunderbar, aber will unbedingt das Konzept anwenden, jenes auf diesen Vorlesungsfolien zu sehen ist http://www-lehre.inf.uos.de/~cg/2010/PD ... -05-18.pdf (ab Folie 9) :

1. Translation in den Ursprung
2. Rotation um die x-Achse in die xz-Ebene
3. Rotation um die y-Achse in die z-Achse
4. Rotation um die z-Achse mit Winkel δ
5. Inversion von Schritt 3
6. Inversion von Schritt 2
7. Inversion von Schritt 1

Ich würde es gerne verwenden, wenn da nicht eine Frage wäre: Wie definiere ich die hier benötigte Rotationsachse mit den normalen Mausbewegungen? Eine Zeichnung verdeutlicht mein bisheriges Verständnis bzw. meinen naiven Ansatz:

Bild

Um die rote Rotationsachse zu bestimmen, leite ich aus der alten Mausposition x1,y1 und x2,y2 eine Gerade her und bestimme den Schnittpunkt des Ursprungs-Punkt(0,0,0) mit dieser...bzw. den Schnittpunkt des von dem Ursprung in Richtung blaue Gerade gehenden Vektors, um den Punkt auf der Geraden zu bekommen (natürlich ist hier der kürzeste Abstand von Punkt und Gerade mit rechtem Winkel gemeint). Danach kann ich die oben erwähnten Schritte durchführen und bekomme so meine gewünschte Drehung des Objektes.

Würde es so funktionieren? Wo liegt mein Denkfehler?


Grüüße
m.sirin


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Mo Aug 02, 2010 23:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ähm, es ist schon spät usw....vielleicht verstehe ich daher nicht ganz was du willst, aber wenn man um eine beliebige Achse drehen will verwendet man üblicherweise die Formel von Rodrigues':
Code:
Matrix44d Matrix44d::rotationAxis(const Vector3d& axis, const double& angle)
{
   Vector3d n = axis.normalized();
   // Rodrigues' rotation formula
   double tSin = sin(angle);
   double tCos = cos(angle);
   double tCosI = 1.0 - tCos;

   return Matrix44d(
      (tCosI * n.x * n.x) + tCos,
      (tCosI * n.x * n.y) - (tSin * n.z),
      (tCosI * n.x * n.z) + (tSin * n.y),
      0.0,
      (tCosI * n.y * n.x) + (tSin * n.z),
      (tCosI * n.y * n.y) + tCos,
      (tCosI * n.y * n.z) - (tSin * n.x),
      0.0,
      (tCosI * n.z * n.x) - (tSin * n.y),
      (tCosI * n.z * n.y) + (tSin * n.x),
      (tCosI * n.z * n.z) + tCos,
      0.0,
      0.0,
      0.0,
      0.0,
      1.0
   );
}

Der Code ist aus meiner CoolMath-Lib (siehe Projekte-Forum), ich habe nur schnell den Template-Kram raus genommen.

Was hat die Rotation um eine beliebige Achse mit der Mausbewegung zu tun? Naja, vielleicht sollte ich wirklich schlafen gehen ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Di Aug 03, 2010 00:06 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
Coolcat hat geschrieben:
Ähm, es ist schon spät usw....vielleicht verstehe ich daher nicht ganz was du willst,

Oh ja, vielleicht sogar so spät, dass man sich auch nicht mehr verständlich ausdrücken kann :mrgreen:. Es geht um die Rotationsachse. Wie definiere ich sie, woher bekomme ich diese?

Coolcat hat geschrieben:
aber wenn man um eine beliebige Achse drehen will verwendet man üblicherweise die Formel von Rodrigues':

Oh, also noch eine Möglichkeit..gibt wohl ganz schön viele Varianten diese Art von Rotation durchzuführen.. Aber auch hier ist eine Achse gefordert, die ich nicht so ohne Weiteres angeben kann (?).

Coolcat hat geschrieben:
Was hat die Rotation um eine beliebige Achse mit der Mausbewegung zu tun? Naja, vielleicht sollte ich wirklich schlafen gehen ;)

Habe mir gedacht, dass ich durch die Mausbewegung (im 3D-Canvas für WebGL), z.b. diagonal von oben links (0,2,0) nach rechts unten (2,0,0) auf die im ersten Post beschriebene Art eine Rotationsachse bekommen kann, um die ich dann die Objekte um einen bestimmten Winkel drehen kann.


...kann es sein, dass ich hier etwas durcheinander bringe?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Di Aug 03, 2010 07:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Habe mir gedacht, dass ich durch die Mausbewegung (im 3D-Canvas für WebGL), z.b. diagonal von oben links (0,2,0) nach rechts unten (2,0,0) auf die im ersten Post beschriebene Art eine Rotationsachse bekommen kann, um die ich dann die Objekte um einen bestimmten Winkel drehen kann.

Also das würde vom Prinzip funktionieren, aber nicht sonderlich schön aussehen. Der übliche Trick ist die Mauskoordinaten auf eine (Halb-) Kugel zu projizieren, d.h. die Mauskoordinaten sind dann ein Vektor vom Kugelzentrum zu einem Punkt auf der Kugeloberfläche. Die Rotationsachse bekommst du über das Kreuzprodukt zwischen altem und neuem Vektor. Den Winkel über das Dot-Produkt.
Der Effekt ist ungefähr so als wäre das Objekt auf dem Bildschirm eine Kugel und du kannst diese drehen indem du mit einem Finger (=Cursor) an einer Stelle anfasst und schiebst.
Ich persönlich bevorzuge aber eine andere Variante, nämlich ohne freie Rotationsachse. Die Rotation wird in zwei Rotationen um die Koordinatenachsen geteilt.

Edit: Hier noch der Code für die Projektion auf die Kugel. Ich benutze das hier allerdings um die Kamera via gluLookAt zu rotieren, daher befindet sich der Benutzer innerhalb der Kugel, nicht außerhalb.
Code:
static const float sq2 = sqrt(2);
dir.x = cursor.x * sq2;
dir.y = cursor.y * sq2;
dir.z = sqrt(1.0f - (dir.x*dir.x) - (dir.y*dir.y));

m_angleHorizontal += atan(dir.x/dir.z);
m_angleVertical   += atan(dir.y/dir.z);

if (m_angleHorizontal <  0        ) { m_angleHorizontal += 2*CML::PI; }
if (m_angleHorizontal >= 2*CML::PI) { m_angleHorizontal -= 2*CML::PI; }
if (m_angleVertical < -CML::PI/2.0f+0.1f) { m_angleVertical = -CML::PI/2.0f+0.1f; }
if (m_angleVertical >  CML::PI/2.0f-0.1f) { m_angleVertical =  CML::PI/2.0f-0.1f; }
// compute new basis vectors
float sinH = sin(m_angleHorizontal);
float cosH = cos(m_angleHorizontal);
float sinV = sin(m_angleVertical);
float cosV = cos(m_angleVertical);
m_direction = CML::Vector3f(cosV*cosH, sinV, cosV*sinH);
m_up = CML::Vector3f(-sinV*cosH, cosV, -sinV*sinH);

Dabei enthält cursor die Cursor-Position transformiert in den Raum -1...1. Raus kommt die oben erwähnte Zerlegung in zwei Winkel, welche dann benutzt wird um einen up-Vektor sowie einen Vektor für die Blickrichtung zu berechnen. Das wird dann in gluLookAt eingesetzt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Di Aug 03, 2010 15:21 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
Coolcat hat geschrieben:
Also das würde vom Prinzip funktionieren, aber nicht sonderlich schön aussehen.

Cool, aber was wäre denn daran falsch oder unschön ?

Zitat:
Der übliche Trick ist die Mauskoordinaten auf eine (Halb-) Kugel zu projizieren, d.h. die Mauskoordinaten sind dann ein Vektor vom Kugelzentrum zu einem Punkt auf der Kugeloberfläche. Die Rotationsachse bekommst du über das Kreuzprodukt zwischen altem und neuem Vektor. Den Winkel über das Dot-Produkt.

Okay, das Zentrum der Kugel ist dann mit dem Ursprung des Modellkoordinatensystems gleichzusetzen? Gibt es eine Bezeichnung für dieses Verfahren ? Habe nichts googlen können..

Zitat:
Ich persönlich bevorzuge aber eine andere Variante, nämlich ohne freie Rotationsachse. Die Rotation wird in zwei Rotationen um die Koordinatenachsen geteilt.

Derzeit mache ich das auch noch so, wollte nur wissen, welche Möglichkeiten es noch so gibt :shock:

Zitat:
Edit: Hier noch der Code für die Projektion auf die Kugel.

Alles klar, werde mal ein wenig rumprobieren. Danke dir!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Di Aug 03, 2010 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Cool, aber was wäre denn daran falsch oder unschön ?

Die Bewegung ist halt leicht komisch wenn du weitere Strecken bewegst, weil es eben keine Kugel ist ;)

Zitat:
Okay, das Zentrum der Kugel ist dann mit dem Ursprung des Modellkoordinatensystems gleichzusetzen?

Das Zentrum der Kugel ist das Rotationszentrum in der Bildschirmmitte. Mit Modellkoordinaten hat das erst mal nichts zu tun.

Zitat:
Derzeit mache ich das auch noch so, wollte nur wissen, welche Möglichkeiten es noch so gibt :shock:

Also z.B. Blender benutzt ja diese freie Rotation, aber ich habe irgendwie immer das Problem das ich das Objekt unfreiwillig auf den Kopf stelle (im übertriebenen Sinne). Wenn die Rotationsachsen fest sind kann das halt nicht passieren.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Mi Aug 04, 2010 19:02 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
Hallo, danke für deine Antworten!

Zitat:
Das Zentrum der Kugel ist das Rotationszentrum in der Bildschirmmitte. Mit Modellkoordinaten hat das erst mal nichts zu tun.

Hmm ziemlich interessant das mit der Halbkugelprojektion, aber ich habe immernoch Schwierigkeiten mir das vorzustellen. Ich mach mal ein paar Zeichnungen, um zu verdeutlichen wie ich das bisher verstehe:

1. Der gesamte aktuelle Ausschnitt bzw. potentielle Mausposition wird auf eine Halbkugel projeziert:
Bild
(blödes Bild..)

2. Nachdem eine Mausbewegung stattgefunden hat oder zwei Richtungsvektoren definiert sind, haben wir einen bestimmten Winkeln und durch das Kreuzprodukt dieser beiden Vektoren eine Rotationsachse (Bild 3). Um die wir die ganzen Objekte drehen können:
Bild
(Bild 2: Ansicht von der Seite)

3. Die Rotationsachse ist die Achse, die auch durch den Ursprung aller Objekte geht:
Bild
(Bild 3: Drehachse und Drehung)

Oder werden die Objekte auch um die Rotationsachse (grüne Linie in Bild 3) rotiert, jene in der Bildschirmmitte ist?


...mich interessiert die Theorie so sehr, weil ich derzeit an meiner Dissertation ..ääh Bachelorarbeit (ist ja eh fast das gleiche^^) schreibe und sowas reinkommen soll/muss. Den Code von dir habe ich eh nicht so richtig verstanden (will ich erstmal auch nicht :) )


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Do Aug 05, 2010 09:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Den Code von dir habe ich eh nicht so richtig verstanden (will ich erstmal auch nicht :) )

Das wichtige sind die ersten 4 Zeilen. Die Cursor-Koordinaten werden in den Raum -sqrt(2)...sqrt(2) skaliert. Dazu wird dann eine Z-Koordinate berechnet. Anschließend sollte man da normalisieren, in meinem speziellen Fall ist das aber nicht nötig, da ich ja nur dir.x/dir.z bzw. dir.y/dir.z brauche.

Zitat:
Oder werden die Objekte auch um die Rotationsachse (grüne Linie in Bild 3) rotiert, jene in der Bildschirmmitte ist?

Du berechnet eine Roatationsachse durch die Bildschirmmitte. Du könntest aber natürlich auch jeden anderen Punkt des Bildschirms als Drehpunkt wählen indem du einfach die Cursor-Koordinaten so verschiebst, dass diese am gewünschten Punkt den Wert (0,0) haben. Du musst natürlich aufpassen das die Wurzel in Zeile 4 nicht negativ wird, also die Cursor-Wert entsprechend abschneiden.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Do Aug 05, 2010 18:17 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
Okay, das heißt, dass ich das Objekt (hier: das wunderschöne Herz) auch in die Bildschirmmitte bzw. Ursprung des Weltkoordinatensystems (0,0,0) verschieben kann, damit es wie gewünscht rotiert wird? Dazu wieder eine Zeichnung^^:

Bild

...also kurz: Habe ich es so ungefähr verstanden bzw. sind die oberen Zeichnungen (bis auf das 3.Bild, das ja nicht die korrekte Funktionsweise wiedergibt) richtig?


Danke dir :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Do Aug 05, 2010 20:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Okay, das heißt, dass ich das Objekt (hier: das wunderschöne Herz) auch in die Bildschirmmitte bzw. Ursprung des Weltkoordinatensystems (0,0,0) verschieben kann,

Klar, du kannst immer Sachen verschieben, warum auch nicht?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Do Aug 05, 2010 23:18 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
Zitat:
Klar, du kannst immer Sachen verschieben, warum auch nicht?

das bezog sich eher hier drauf:
Zitat:
Du berechnet eine Roatationsachse durch die Bildschirmmitte. Du könntest aber natürlich auch jeden anderen Punkt des Bildschirms als Drehpunkt wählen indem du einfach die Cursor-Koordinaten so verschiebst, dass diese am gewünschten Punkt den Wert (0,0) haben. Du musst natürlich aufpassen das die Wurzel in Zeile 4 nicht negativ wird, also die Cursor-Wert entsprechend abschneiden.


Statt einen anderen Drehpunkt durch Verschieben der Cursor-Koordinaten, kann ich doch auch das Model in die Mitte des Bildschirms schieben. Ich stelle mir das so vor, wie bei einer normalen Rotation eines Models, das man in den Ursprung schieben muss, um eine Drehung um seine eigene Achse zu erzielen. Anschließend kann mans ja wieder zurückverschieben..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rotation um beliebige Achse
BeitragVerfasst: Do Aug 05, 2010 23:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Der Drehpunkt sollte da wo der User den Mittelpunkt des Modells sieht.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

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


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.137s | 17 Queries | GZIP : On ]