Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » OpenGL » Kamerasteuerung / GL_MODELVIEW

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.09.2004, 14:53 Uhr
tronaccount



Hallo,

ich hatte vor einiger Zeit mal nach einem Vorbild für eine um eine OpenGL-Szene kreisende Kamera gefragt und dabei (danke nochmals) den Tip bekommen, mir die Seite www.nigels.com/glt/gltzpr/ mal anzuschauen. Top, da habe ich genau gefunde, was ich suche. Leider ist das eine Implementation für GLUT, und ich arbeite mit der MFC und einem Windows-Fenster, aber immerhin. Es werden für die Kamerasteuerung selbst auch gar keine GLUT-Befehle verwendet, also sollte(!) die Portierung einfach sein.

Die Idee: Die Szene soll in eine virtuelle Kugel eingepackt werder, die man mit der Maus "anfassen" und dann drehen kann.

Ich muß also die Transformationsmatrix der Szene invertieren, meine globalen Koordinaten (in dem Fall die x- und y-Achse meiner "Monitorebene", um die ich drehen will, um einen realisischen Eindruck zu bekommen) ins Modellkoordinatensystem transformieren und mit glRotate() anwenden. Schon rotiert die Szene im die "Monitorachsen"...

Richtig? Ich hoffe...

Ich starte bei der Initialisierung mit einem glLoadIdentity().

Ich hole mir in OnMouseMove() also meine aktuelle Matrix und invertiere


C++:

//Aktuelle MODELVIEW-Matrix holen
            
glGetFloatv(GL_MODELVIEW, mvMatrix);
        
//Matrix invertieren
            
MatrixInvert(mvMatrix, invMatrix);




dann hole ich die Mauskoordinaten und baue mir einen Drehvektor. Erst den globalen in Bildschirmkoordianten, dann transformiere ich und wende an.


C++:

//Inkrementelle Mausbewegung erfassen, MousePos wird bei OnButtonDown() erfaßt, point ist die akutelle Mausposition aus der OnMouseMove()
        
dx = MousePos.x - point.x;
dy = MousePos.y - point.y;
        
//Drehvektor bestimmen
        
rotVectorGlobal[0] = dy;
rotVectorGlobal[1] = dx;
rotVectorGlobal[2] = 0;

rotVectorLokal[0] = invMatrix[0]*rotVectorGlobal[0]    +    invMatrix[4]*rotVectorGlobal[1] +    invMatrix[8]*rotVectorGlobal[2];
        rotVectorLokal[1] = invMatrix[1]*rotVectorGlobal[0]    +    invMatrix[5]*rotVectorGlobal[1] +    invMatrix[9]*rotVectorGlobal[2];
        rotVectorLokal[2] = invMatrix[2]*rotVectorGlobal[0]    +    invMatrix[6]*rotVectorGlobal[1] +    invMatrix[10]*rotVectorGlobal[2];
        
//Winkel bestimmen
        
angle = 0;
angle = sqrt(dx*dx + dy*dy);
        
glRotatef(angle, rotVectorLokal[0], rotVectorLokal[1], rotVectorLokal[2]);
        
//darstellen
Invalidate(FALSE);




Leider klappt das Ganze nicht. Die ModelView-Matrix sieht nämlich schon total seltsam aus und ist immer die gleiche, trotz Aufruf von glRotale:

t = 0:
Globaler Vektor
1 6 0
ModelView Matrix (nur Drehanteil)
-4.31602e+008 -4.31602e+008 -4.31602e+008
-4.31602e+008 -4.31602e+008 -4.31602e+008
-4.31602e+008 -4.31602e+008 -4.31602e+008
Lokaler Vektor nach Invertierung der ModelView
-4.31602e+008 -4.31602e+008 0

t = 1:
Globaler Vektor
1 12 0
ModelView Matrix (nur Drehanteil)
-4.31602e+008 -4.31602e+008 -4.31602e+008
-4.31602e+008 -4.31602e+008 -4.31602e+008
-4.31602e+008 -4.31602e+008 -4.31602e+008
Lokaler Vektor nach Invertierung der ModelView
-3.02121e+009 -3.02121e+009 0
.
.
.

Auf dem Bildschirm dreht die Szene immer um dieselbe Achse, was ja auch zum immer gleich orientierten Lokalen Vektor paßt :-(

Wiese bekomme ich so eine seltsame ModelView-Matrix? Müßte nach dem ersten Aufruf nicht die Einheitsmatrix ausgegeben bekommen?

Danke schonmal & sorry für's lange Posting :-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.09.2004, 09:57 Uhr
stephanw
localhorst


Hi !

Mal als Verständnisfrage: Du willst eine Kamera, mit der man sich um die Szene drehen kann ? Wie wenn man sich ein Objekt von allen Seiten ansehen will ? Ich verwende so eine Kamera, allerdings nicht mit Rotate und Matrix-Invertieren. Die Idee ist, den Punkt zu merken, auf den die Kamera schaut und die Kamera-Position. Letztere aber in Kugelkoordinaten. Dann setzt man die Änderung der Maus um in die Änderung der beiden Kugel-Winkel, rechnet die kartesischen Koordinaten aus und ruft dann gluLookAt (...) auf.
Hier ist ein Beispielprogramm für Win (alle drei Maustasten können benutzt werden). Benutzt GLUT, ist aber portierbar (nur die Mausinteraktion und die "Szene"). Falls Dir das helfen würde, sag bescheid, der Code ist etwas zu lang zum hier posten.
--
Reden ist Schweigen und Silber ist Gold.

Dieser Post wurde am 14.09.2004 um 10:00 Uhr von stephanw editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.09.2004, 15:18 Uhr
tronaccount



Danke für die Antwort!

Ich habe den Fehler in meinem Code gefunden:

Statt

glGetFloatv(GL_MODELVIEW, mvMatrix)

muß ich

glGetFloatv(GL_MODELVIEW_MATRIX, mvMatrix)

aufrufen. Kleiner Fehler, große Ursache...

PS: Ich war bis gestern im Urlaub - das downloaden von Deinem File hat heute irgendwie nicht mehr funktioniert - könntest Du mir den Quellcode mal zukommen lassen? Nur so aus Neugierde, wie's auch gehen könnte

Dieser Post wurde am 22.09.2004 um 15:25 Uhr von tronaccount editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.09.2004, 19:34 Uhr
stephanw
localhorst


Datei liegt (seit heute ) hier. Quellen hier.
Linke Maustaste: drehen um das Objekt
Rechte Maustaste: zoom in/out
Mittlere Maustaste: verschieben horizontal/vertical
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ OpenGL ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: