# GLFW 3D Maus- Input



## BrknDEV (28. Apr 2018)

Hey 
Ich bin letztens von lwjgl 2 zu lwjgl 3 umgestiegen.
Nun, momentan habe ich Schwierigkeiten mit GLFW.
Ich programmiere momentan eine kleine Engine, um Dinge wie Edge- Collapse und anderes auszuprobieren. Dabei möchte ich mich wie in jedem anderen Spiel mit der Maus umgucken können. Irgendwann verlässt die Maus dann aber das Fenster, was ich natürlich nicht möchte.
Bei lwjgl 2 ging das ganze ja ganz einfach:

```
Mouse.setGrabbed(true);
//Dann die Maus mittig in den Bildschirm platzieren (Die Methode dafür habe ich vergessen)
Mouse.setGrabbed(false);
```

Bei lwjgl 3 gibt es das aber leider nicht :/
Stattdessen habe ich jetzt einen wahrscheinlich denkbar langsamen Workaround gefunden, welcher aber etwas "zittert", wenn man die Maus diagonal bewegt:


```
public void updateMouse(long window) {
        camera.setYaw(((float) Math.toRadians(getMousePosition(window).x + delta.x)) * 2);
        camera.setPitch(((float) Math.toRadians(getMousePosition(window).x + delta.y)) * 2);
     
        Vector2f oldPos = getMousePosition(window);
        GLFW.glfwSetCursorPos(window, Options.DISPLAY_SIZE.x / 2, Options.DISPLAY_SIZE.y / 2);
        Vector2f newPos = getMousePosition(window);
        delta.x += oldPos.x - newPos.x;
        delta.y += oldPos.y - newPos.y;
    }
 
    private Vector2f getMousePosition(long window) {
        mouseX = BufferUtils.createDoubleBuffer(1);
        mouseY = BufferUtils.createDoubleBuffer(1);
     
        GLFW.glfwGetCursorPos(window, mouseX, mouseY);
     
        Vector2f mousePosition = new Vector2f((float) mouseX.get(), (float) (mouseY.get()));
        return mousePosition;
    }
```

(mouseX und mouseY sind beide DoubleBuffer und delta ist ein Vector2f (JOML))

Kennt da jemand vielleicht einen besseren Weg?


----------



## httpdigest (1. Mai 2018)

glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED) -> http://www.glfw.org/docs/latest/group__input.html#gaa92336e173da9c8834558b54ee80563b


----------



## BrknDEV (2. Mai 2018)

httpdigest hat gesagt.:


> glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED)



Das Problem damit ist nur, dass es hin und her springt und die Maus nicht wirklich im Bild bleibt (Sie wird nur ab und zu in die Mitte gesetzt)

Ich habs jetzt so, aber es springt halt wie gesagt manchmal (etwa alle 10 Sekunden)


```
public void updateMouse(long window) {
        GLFW.glfwSetInputMode(window, GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_DISABLED);
        GLFW.glfwSetCursorPos(window, Options.DISPLAY_SIZE.x / 2, Options.DISPLAY_SIZE.y / 2);
        GLFW.glfwSetInputMode(window, GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_NORMAL);
       
        camera.setYaw((float)(getMousePosition(window).x / 2));
        camera.setPitch((float)(getMousePosition(window).y / 2));
    }
   
    private Vector2f getMousePosition(long window) {
        mouseX = BufferUtils.createDoubleBuffer(1);
        mouseY = BufferUtils.createDoubleBuffer(1);
       
        GLFW.glfwGetCursorPos(window, mouseX, mouseY);
       
        Vector2f mousePosition = new Vector2f((float) mouseX.get(), (float) (mouseY.get()));
        return mousePosition;
    }
```


----------



## httpdigest (2. Mai 2018)

Da sollte überhaupt nichts springen. Du darfst die Mausposition dann niemals selber mit glfwSetCursorPos() setzen. Das macht alles GLFW automatisch. Also: Einfach einmal den Cursor Mode auf DISABLED setzen und dann nichts weiter irgendwie manuell machen. Funktioniert ganz wunderbar. Schau dir ein Beispiel hierzu mal hier an: https://github.com/JOML-CI/joml-lwj...rg/joml/lwjgl/FirstPersonCameraDemo.java#L110


----------



## BrknDEV (2. Mai 2018)

Ohhh, achso 
Vielen Dank, läuft alles wunderbar


----------



## BrknDEV (9. Mai 2018)

Jetzt ist mir noch etwas aufgefallen:
wenn ich z.B. mit 
	
	
	
	





```
if(pitch <0) pitch = 0;
```
den Bereich der Kamerabewegung einschränke, funktioniert dies zwar, wenn ich aber in diesem Beispiel nach unten gucke, die Kamera stehen bleibt aber ich trotzdem die Maus weiter bewege, beginnt der Pitch sich erst wieder zu erhöhen, wenn ich die Maus an die selbe Stelle bringe. Muss ich mir da eine Art Offset speichern oder geht sowas auch eleganter?


----------



## httpdigest (9. Mai 2018)

Üblicherweise arbeitest du bei den Mausbewegungen mit Delta-Änderungen, indem du dir "currentX" und "currentY" merkst und jedesmal, wenn sich die Maus bewegt, "deltaX/Y = mouseX/Y - currentX/Y" rechnest und dann "currentX/Y = mouseX/Y" setzt und das Delta verarbeitest.
Das heißt, der Pitch wird bei einer Mausbewegung mit: "pitch += deltaY" berechnet, UND DANN gecapped mit entweder deinem if-Statement oder einfach: "pitch = Math.max(0, pitch)".
In diesem Fall musst du nicht erst "den gesamten Mausweg" wieder "hochlaufen", um über den Minimal-Pitch von 0 zu kommen.


----------



## BrknDEV (9. Mai 2018)

Ahh, stimmt  das ist eine Idee
Funktioniert auch ganz gut. Mit Vsync merkt man nur, dass es ein paar Pixel springt, dann lass ich das einfach aus, oder?


----------

