OpenGL mit glut: Maus verlässt das Fenster - kein free look möglich



  • Hallo zusammen,

    ich habe Probleme mit glut eine free look Kamera hinzubekommen.

    Im Grunde ist steht die Implementierung und man kann sich auch "umschauen". Dazu wird die Maus in einer Callback-Funktion, die mit glutPassiveMotionFunc regisriert wurde, ausgewertet.
    Leider nur soweit bis der Mauszeiger an der Grenze des Fensters ist und es dann verlässt.
    Dann werden keine glutPassiveMotionFunc - Ereignisse mehr generiert.

    Ich habe danach die Funktion glutWarpPointer dazugenommen die dann den Mauszeiger wieder in die Mitte zurücksetzt. Leider erzeugt das selbst wieder Aufrufe der Callbackfunktion. Ich habe dann quasi ein "Abbruck der Rekursion eingebaut" und auch verschiedene varianten getestet wie z.B. die Position sofort zurückzusetzten oder nach 10 mal oder erst wenn es sich bei 1/4 der Aufläsung am Rand befindet oder ganz am Rand.

    Das hat alles nicht so richtig gefruchtet.
    Das Problem ist das die Kamera manchmal beim Rücksprung durch glutWarpPointer "zappelt" oder dass sich die Bewegung "verlangsamt" um so schneller mal die Maus bewegt.

    Ich habe schon viel gesucht und viele Tutorials gelesen. Aber alle beschäftigen sich meist nur mit Vektoren & Matrizen. Verwendet wird aber immer ein glutPassiveMotionFunc - Callback.
    Nur auf das Problem dass die Maus das Fenster verlassen kann geht leider niemand ein.

    Kennt jemand einen guten Artikel dazu?



  • Wenn du die Maus schnell hin und her bewegst, dann werden viele Bewegungsereignisse der Maus generiert, fuer die die Callback aufgerufen wird. Das beansprucht Rechenzeit. Glut ist eine einfache API, normalerweise fragt man periodisch die Eingabegraete ab und schaut, was sich geaendert hat.

    Einsperren der Maus im Fenster: In SDL kann man die Maus im aktuelle Fenster einsperren. Ob das in glut moeglich ist, weiss ich nicht.



  • Die glutWarpPointer() Funktion wird periodisch aufgerufen (siehe knivil), nicht in der Funktion glutPassiveMotionFunc(). Die glutTimerFunc() ist hier besser geeignet.

    Falls die Maus das Fenster verlässt, kann man das mit glutEntryFunc() testen.



  • Danke für eure Antworten,

    nochmal die Kernfrage: Kann man mit glut allein sinvoll ein "free-look" mit der Maus, wie in typischen "First-Person-Shooter"-Spiele üblich, implementieren?

    So wie ich bisher verstanden habe ist das nicht möglich und man soll die Eingabe über eine andere Bibliothek machen, z.B. SDL.

    Was wäre das sinnvollste?



  • Hi Stefan,

    ich entsinne mich, dass das aber doch recht gut mit GLUT zu implementieren war, als ich soetwas damals mal eingebaut hatte. Kompletter Rundumview wie in Descent
    und ohne Ruckeln. Aber das ist schon einige Jahre her.

    Generell würde ich das so wie in einem Asteroid-Game implementieren. Geht die Maus an einer Bildschirmseite raus, dann kommt sie auf der anderen Seite wieder rein. So musst du die Maus nur so wenig neu setzen wie möglich. Dabei rechnest du mit virtuellen Mauskoordinaten, welche du aus den Anzahlen der Bildschirmumbrüche, der Bildschirmgröße und deiner aktuellen Mausposition auf dem Bildschirm leicht errechnen kannst. Dann hast du schonmal virtuelle Mauskoordinaten die beliebig wachsen oder abnehmen können. Mit diesen kannst du dann auch leicht deine relativen Mauskoordinaten ausrechnen. Mit den relativen Koordinaten, ausgerechnet auf der Basis der virtuellen Koordinaten kannst du dann deinen Free-Look realisieren. Und zwar setzt du deinen Line-Of-Sight einfach auf eine logische Kugel, und zwar auf die Kugel-Position abhängig von deinen relativen Mauskoordinaten. So klappte das wunderbar bei mir!

    Oder ist dein Problem garnicht nicht die Implementierung, sondern das GLUT irgendwie zu langsam ist? Dann entschuldige, dass ich deine Zeit mit diesem Beitrag verschwendet habe 😃

    Gruß
    Soul


Anmelden zum Antworten