Seite 1 von 5
fps mit glutWarpPoiner???
Verfasst: So Jun 20, 2010 6:52 pm
von paparoach777
Hallo,
ich versuche schon seit längerer Zeit eine Kamera in Ego Perspektive in OpenGl zu implementieren. Das hat an sich auch gut geklappt, nur die maus kam immer wieder aus dem bildschirm...
ich habe von der funktion glutWarpPointer gehört, nur wenn ich sie benutze, hält sie meinen cursor irgendwie im fenster gefangen und ich kann die scene nicht mehr rotieren...
woran liegt das?? ich weiß langsam echt nicht mehr weiter
Bitte schnelle Antworten!
Re: fps mit glutWarpPoiner???
Verfasst: So Jun 20, 2010 8:02 pm
von Xin
paparoach777 hat geschrieben:Hallo,
ich versuche schon seit längerer Zeit eine Kamera in Ego Perspektive in OpenGl zu implementieren. Das hat an sich auch gut geklappt, nur die maus kam immer wieder aus dem bildschirm...
ich habe von der funktion glutWarpPointer gehört, nur wenn ich sie benutze, hält sie meinen cursor irgendwie im fenster gefangen und ich kann die scene nicht mehr rotieren...
woran liegt das?? ich weiß langsam echt nicht mehr weiter
Bitte schnelle Antworten!
Ich habe mal eben die Funkton nachgeschlagen: "Warping means moving, just as if the user had manually moved the mouse."
Wenn Du die Maus bewegst und anschließend sie per Warp zurückbewegst, dann wird vermutlich nichts passieren.
Re: fps mit glutWarpPoiner???
Verfasst: Mo Jun 21, 2010 12:39 pm
von paparoach777
ja und genau das ist mein problem...
ES PASSIERT NICHTS!!!
irgendwie muss das doch gehen oder??
Kann auch ne andere Funktion als glutWarpPointer sein, muß aber cross_plattform kompatibel sein
Re: fps mit glutWarpPoiner???
Verfasst: Mo Jun 21, 2010 1:48 pm
von cloidnerux
WANN benutzt du glutWarPointer?
Bevor oder nachdem du die Mausveränderung festgestellt und gespeichert hast?
Re: fps mit glutWarpPoiner???
Verfasst: Mo Jun 21, 2010 1:59 pm
von paparoach777
ich benutze glutWarpPointer danach
ich glaub ich kenn den genauen fehler:
mein programm nimmt die "gewarpte" position des Mauszeigers als eine Bewegung an, die wirklich vom user gemacht wurde, und meint, das der user die kamera wieder zurückgedreht hat...
fehlt nur noch die lösung
Re: fps mit glutWarpPoiner???
Verfasst: Mo Jun 21, 2010 2:26 pm
von Xin
paparoach777 hat geschrieben:ja und genau das ist mein problem...
ES PASSIERT NICHTS!!!
Also nochmal. Nehmen wir an, Du bewegst die Maus um 10 Pixel nach links. Anschließend bewegst Du die Maus mit glutWarpPointer() wieder um 10 Pixel nach rechts. Dann sollte sich Dein Betrachtungswinkel vermutlich nicht verändert haben.
Bei sagen wir mal 1000 Frames Per Second hast Du also 1 Frame, das um 10 Pixel verschoben ist, was Dein TFT bei 60Hz vermutlich nichtmals geliefert bekommt, weil es ja nur 60 Frames Per Second darstellen kann und selbst, wenn es das Bild darstellt, dann nimmst Du es bestenfalls als kurzes Flackern wahr, sofern Dein Auge gerade den Monitor "abtastet".
Es könnte also etwas passieren, nur siehst Du es nicht, weil Du es mit der glutWarpPointer()-Funktion wieder rückgängig machst.
Prüf das doch mal, in dem Du sie weglässt, bzw. eine kurze Zeit wartest, bis Du sie aufrufst.
PS:
paparoach777 hat geschrieben:ich glaub ich kenn den genauen fehler:
mein programm nimmt die "gewarpte" position des Mauszeigers als eine Bewegung an, die wirklich vom user gemacht wurde, und meint, das der user die kamera wieder zurückgedreht hat...
Darum habe ich Dir gequotet, dass die Funktion sich so verhält, als ob der User die Maus bewegt.
paparoach777 hat geschrieben:fehlt nur noch die lösung
Möglichkeit 1: eine Globale Variable "bool reactOnMouseMoves", die Du vor Warp auf 'false' setzt.
Möglichkeit 2: Finde die richtige Funktion ^^
Re: fps mit glutWarpPoiner???
Verfasst: Mo Jun 21, 2010 4:52 pm
von paparoach777
wenn ich glutWarpPointer komplett weglasse, dann funktioniert alles wie es soll, nur die maus kann das fenster verlassen
Re: fps mit glutWarpPoiner???
Verfasst: Mo Jun 21, 2010 5:16 pm
von Xin
paparoach777 hat geschrieben:wenn ich glutWarpPointer komplett weglasse, dann funktioniert alles wie es soll, nur die maus kann das fenster verlassen
Nach kurzem Surfen fand ich keine Lösung, jedenfalls keine Plattformunabhängige.
Da bleibt dann wohl erstmal nur die Lösung, gluWarpPointer zu nehmen, aber für diesen Moment halt die globale Variable zu nehmen.
Schreib Dir also eine eigene WarpPointer:
Code: Alles auswählen
bool reactOnMouseMove;
inline void myWarpPointer( int x, int y )
{
reactOnMouseMove = false;
gluWarpPointer( x, y );
reactOnMouseMove = true;
}
und füge in Deine MouseFunc
ein.
Re: fps mit glutWarpPoiner???
Verfasst: Mo Jun 21, 2010 5:50 pm
von cloidnerux
Oder Prüfe, ob die neue Mausbewegung als Exakte Gegenbewegung zur alten gilt, was dann das bewegen durch gluWarpPointer entspräche und reagiere dann netsprechend.
Re: fps mit glutWarpPoiner???
Verfasst: Mo Jun 21, 2010 6:06 pm
von Kerli
Ich hatte ebenfalls das gleiche Problem, nur das ich nicht glut sondern SDL verwenden. Bei der SDL kann man mit
SDL_WM_GrabInput(SDL_GRAB_ON); verhindern das die Maus das Fenster verlässt. Das einzige Problem daran ist, dass die Maus das Fenster wirklich nicht verlassen kann und man auch nicht mit den üblichen Tastenkombinationen zum Desktop zurück gelangen kann (Zumindest unter Linux). Zurzeit minimiere ich das Programm deshalb sobald die entsprechende Tastenkombination zum anzeigen vom Desktop gedrückt wird, also <Ctrl><Alt>d unter Linux und <Super>d unter Windows.
Die entsprechenden Teile meiner Nachrichten schleife schauen wie folgt aus:
Code: Alles auswählen
SDL_Event event;
while( SDL_PollEvent(&event) )
{
switch( event.type )
{
// ...
case SDL_ACTIVEEVENT:
if( !has_focus && event.active.state && event.active.gain )
{
SDL_ShowCursor(0);
SDL_WM_GrabInput(SDL_GRAB_ON);
has_focus = true;
}
break;
case SDL_KEYDOWN:
case SDL_KEYUP:
{
// Handle system key combinations to leave grab mode
#ifdef linux
const core::uint16 system_command = KMOD_LALT | KMOD_LCTRL;
if( (event.key.keysym.mod & system_command) == system_command )
#else
if( SDL_GetKeyState(0)[SDLK_LSUPER] )
#endif
{
if( event.key.keysym.sym == SDLK_d )
{
// show desktop
SDL_WM_GrabInput(SDL_GRAB_OFF);
SDL_ShowCursor(1);
SDL_WM_IconifyWindow();
has_focus = false;
}
}
break;
}
Der Code funktioniert schon recht gut. Man könnte nur eventuell auch noch auf andere Tastenkombination reagieren wie zb Fenster wechseln mit Tab, aber dazu bin ich noch nicht gekommen
Ob es die gleichen Funktionen bei glut auch gibt kann ich nicht sagen, aber die SDL wäre sicherlich auch keine schlecht plattformunabhängige Alternative.