Du bist nicht angemeldet.

Werbeanzeige

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

1

13.12.2021, 17:36

Maus-Steuerung (Pitch, Yaw) mit WIN32, was ist der beste Ansatz

Hallo Forum

Ich habe eine auf Win32 basierende 3D-Applikation mit Vulkan geschrieben.
Jetzt möchte ich die Kamera mit der Maus steuern (Pitch, Yaw).
Dafür habe ich mir folgenden Ansatz ausgedacht:
- Postieren des Mauscursors in der Bildschirmmitte
- In der Funktion LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) im CASE WM_MOUSEMOVE die x/y Position
des Mauscursors ermitteln.
- Den jeweiligen Abstand des Cursors zur Initialposition (Bildschirmmitte) ermitteln und zu einer entsprechenden Variable (fPitch, fYaw) addieren.
- Danach erneutes Positionieren des Mauscursors in der Bildschirmmitte.
- In der Renderloop die Kamera entsprechend der Werte in fPitch und fYaw rotieren.
- Danach fPitch und fYaw nullen.

Prinzipiell funktioniert das auch außer bei sehr geringen Framerates.
Weiß einer von euch eventuell einen besseren Ansatz ?
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

David Scherfgen

Administrator

Beiträge: 10 356

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

13.12.2021, 18:42

Du könntest direkt auf die Maus zugreifen ohne den Umweg über die Cursor-Position. Das geht z. B. mit DirectInput.

Schrompf

Alter Hase

Beiträge: 1 450

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

3

14.12.2021, 11:34

Das kann man so machen, machen manche so. Allerdings solltest Du dann den Mauszeiger verstecken. Und Du brauchst sauberes Fokus-Handling, um dieses "Zurücksetzen in die Bildmitte" abzuschalten, wenn die Spielerin alt-tabbt.

Mit Vulkan... Du bist hardcore :-)

Alternativ kannst Du Dir auch eine Input-Lib aus dem Netz nehmen. Das würde ich empfehlen, Input-Coding artet nämlich schnell aus und ist genau wegen dieser Fokus-Geschichten schwer zu debuggen. Leider kann ich Dir gerade auf die Schnelle keine gute Lib nennen, nur meine eigene: SNIIS
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

4

15.12.2021, 12:11

Allerdings solltest Du dann den Mauszeiger verstecken

der ist hidden

Mit Vulkan... Du bist hardcore :-)

aber schnell :)

Danke an euch beide ... werde das mal probieren.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »stef« (15.12.2021, 12:16)


FSA

Community-Fossil

  • Private Nachricht senden

5

17.12.2021, 00:59

Du könntest direkt auf die Maus zugreifen ohne den Umweg über die Cursor-Position. Das geht z. B. mit DirectInput.

DirectInput würde ich dafür nicht empfehlen. Die API ist sehr alt und wird von Microsoft schon lange vernachlässigt. Für Gamepad/Joysticks käme noch XInput in Frage, aber auch die API ist auf dem Abstellgleis.

Für Windows empfiehlt Microsoft den Weg über normale Window-Events. Oder du machst selbst eine Abfrage des Status' der Maus mit den WinAPI Funktionen (GetCursorPos, GetCursorInfo), anstatt die Window-Events zu verarbeiten. Die RawInput API ist auch ein Möglichkeit: https://docs.microsoft.com/en-us/windows…inuser-rawinput

Polling hat natürlich ebenfalls Nachteile, aber du kannst deine Input-Logik selbst schreiben und bist mit den Raw-Input Methoden deutlich flexibler im Vergleich zu DirectInput.
Am einfachsten fand ich bisher die Gainput Lib. Arbeitet auch über polling, und kann einfach in einem separatem Thread laufen. SDL2 wäre auch noch eine Möglichkeit, ist aber eine sehr große Lib.

Generell habe ich aber schon lange den Eindruck, dass es kaum noch moderne Libs für HID-Verarbeitung bei Spielen gibt. Die großen Engines nehmen einfach die low level System-API Funktionen und schreiben alles selbst.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (17.12.2021, 01:13)


Jonathan

Community-Fossil

  • Private Nachricht senden

6

18.12.2021, 19:29

Ich benutze aktuell GLFW (ist ja auch für Vulkan nützlich, wenn man sein Fenster nicht von Hand bauen will), das hat extra einen Modus um den Cursor zu verstecken (GLFW_CURSOR_DISABLED) in dem man dann unbegrenzte Mausbewegungen hat (d.h. nicht mehr auf den Bildschirm beschränkt), man kann also in jedem Frame die Position abfragen und das Delta zum letzten Frame ausrechnen und hat seine Bewegung. Ist bequem und funktioniert gut, habe aber das Gefühl, dass die Steuerung damit doch nicht ganz so weich ist, wie in anderen Ego-Shootern. Vielleicht weil der Cursor auf eine Pixelposition quantisiert wird und der Raw-Input Subpixelgenauigkeit hätte? Vielleicht müsste ich aber auch was Richtung Tripel-Buffering oder anderes VSync oder Motion Blur oder Cursor-Smoothing einbauen, ich hab keine Ahnung...
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige