GLFW 3D Maus- Input

BrknDEV

Mitglied
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:
Code:
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:

Code:
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?
 

BrknDEV

Mitglied
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)

Java:
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;
    }
 

BrknDEV

Mitglied
Jetzt ist mir noch etwas aufgefallen:
wenn ich z.B. mit
Java:
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

Top Contributor
Ü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

Mitglied
Ahh, stimmt :D 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?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
coolian lwjgl glfw window zeigt nur grau an Spiele- und Multimedia-Programmierung 0
H Mausbewegungen wie eine echte Maus in 3 dimensionalen Spielen Spiele- und Multimedia-Programmierung 12
N Schüsse in Richtung der Maus Spiele- und Multimedia-Programmierung 5
Arif Maus-Objekt im Player Klasse implementieren !? Spiele- und Multimedia-Programmierung 2
B Maus Cursor aus/einblenden bei Unity 3d mit .js Spiele- und Multimedia-Programmierung 1
M [JOGL] Maus über einem gezeichnetem Objekt abfragen? Spiele- und Multimedia-Programmierung 5
S Mausklicks innerhalb eines JFrames/SWTBrowser ohne richtige Maus simulieren Spiele- und Multimedia-Programmierung 6
L Bild in Richtung Maus drehen Spiele- und Multimedia-Programmierung 4
M Maus an Fedenkreuz heften Spiele- und Multimedia-Programmierung 16
M Beim schießen richtet sich die Kugel nach der Maus aus (Quaternion) Spiele- und Multimedia-Programmierung 5
D Sprite zur Maus bewegen Spiele- und Multimedia-Programmierung 9
G Maus springt --> Free-Hand-Zeichnen Spiele- und Multimedia-Programmierung 2
G Zeichnung mit der Maus bewegen Spiele- und Multimedia-Programmierung 3
S Schiff in Richtung der Maus rotieren - Problem :/ Spiele- und Multimedia-Programmierung 5
M Grafikprogramm, zeichnen mit Maus Spiele- und Multimedia-Programmierung 7
S Problem bei Kartenbewegung mit Maus! Spiele- und Multimedia-Programmierung 3
M Exakte Position auf Kugel mit Maus picken , Java3d Spiele- und Multimedia-Programmierung 14
D Bilderpositionierung mit Maus Spiele- und Multimedia-Programmierung 23
T Maus-Cursor-Position manipulieren Spiele- und Multimedia-Programmierung 3
K Ein 3D-Objekt mit Maus auswählen Spiele- und Multimedia-Programmierung 5
T Problem mit Maus und Bildschirm Spiele- und Multimedia-Programmierung 3
C NavigationBehaviour mit Maus und Keyboard Spiele- und Multimedia-Programmierung 5
A Maus im Spiel-Menu oder nicht? Spiele- und Multimedia-Programmierung 5
L Audio-volume /w input Sound.sampled Spiele- und Multimedia-Programmierung 1
E Gui Input Spiele- und Multimedia-Programmierung 1
J Audio Input mit Datei abgleichen Spiele- und Multimedia-Programmierung 11
Grejak User Input Kapseln Spiele- und Multimedia-Programmierung 2
M Java Sound API : Zuordnung Port-Mixer zu Input-Mixer Spiele- und Multimedia-Programmierung 9

Ähnliche Java Themen

Neue Themen


Oben