Präzisere Maussteuerung

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Präzisere Maussteuerung

Beitrag von Matthias Gubisch »

Visual Studio bietet da mit Spy++ ne ganz gute Möglichkeit die Daten die an das Fenster gesendet werden von der Maus einfach mal live Anzuschauen
Allerdings könnte ich mir vorstellen das Paint mit WM_MOUSEMOVE arbeitet und nicht mit RAW Input
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Zudomon »

Ich sehe gerade in dem Paper, da steht, das Problem:
Traditional GUI toolkits like Java Swing report pointer movement events as integers. Even toolkits like Qt or WPF which are designed for display resolution independence2 report
motion events as integers, regardless whether they are specified as floating point (with WPF, this is due to integral WM_MOUSEMOVE messages). On OS X, position events are floating point, but these only hold non-integral values with absolute pointing devices such as tablets. For relative devices, Casiez and Roussel [5] show that pointing transfer functions used by Microsoft Windows, OS X, and X.Org apply a speed-dependent float factor on motion deltas but move the pointer according to the sole integral part of the result.
Although the fractional part is preserved internally for later accumulation, it is inaccessible from high-level software.
Matthias Gubisch hat geschrieben:Visual Studio bietet da mit Spy++ ne ganz gute Möglichkeit die Daten die an das Fenster gesendet werden von der Maus einfach mal live Anzuschauen
Allerdings könnte ich mir vorstellen das Paint mit WM_MOUSEMOVE arbeitet und nicht mit RAW Input
Wie gesagt, falls WM_INPUT die RAW Daten liest, dann hab ich damit keine Präzisionsverbesserung... höchstens so Minimal, dass ich die nicht wahrnehme.
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: Präzisere Maussteuerung

Beitrag von Alexander Kornrumpf »

Zudomon hat geschrieben:Also was ich letztendlich erwarte ist doch keine Magie. Sondern einfach eine Subpixel Genauigkeitsmessung der Maus.
Zudomon hat geschrieben: Wie gesagt, falls WM_INPUT die RAW Daten liest, dann hab ich damit keine Präzisionsverbesserung... höchstens so Minimal, dass ich die nicht wahrnehme.
Wenn du Mauseinheiten ("Mickeys") wie Pixel behandeltst ist das ja auch kein Wunder. Ob die Maus subpixelgenau arbeitet ist keine Frage der Sensorik sondern der Umrechnung von Mauseinheiten in Pixel.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Zudomon »

Alexander Kornrumpf hat geschrieben:
Zudomon hat geschrieben:Also was ich letztendlich erwarte ist doch keine Magie. Sondern einfach eine Subpixel Genauigkeitsmessung der Maus.
Zudomon hat geschrieben: Wie gesagt, falls WM_INPUT die RAW Daten liest, dann hab ich damit keine Präzisionsverbesserung... höchstens so Minimal, dass ich die nicht wahrnehme.
Wenn du Mauseinheiten ("Mickeys") wie Pixel behandeltst ist das ja auch kein Wunder. Ob die Maus subpixelgenau arbeitet ist keine Frage der Sensorik sondern der Umrechnung von Mauseinheiten in Pixel.
Mach ich das denn? Also die Frage ist ernst gemeint. Ich weiß es nämlich nicht genau. In StoneQuest nehme ich doch die WM_MOUSEMOVE Events und rechne meine "Sensivity" drauf. Damit kann ich ja dann schauen, welche Pixel ich im 3D Raum erreiche. Wenn ich nun statt dessen WM_INPUT benutze, die Sensivity so lasse wie vorher und die gleiche Ungenauigkeit wahrnehme, dann interpretiere ich doch die Mauseinheiten nicht falsch, oder doch?
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Präzisere Maussteuerung

Beitrag von Matthias Gubisch »

Vielleicht solltest du einfach mal anschauen welche Werte du für WM_MOUSEMOVE und welche bei WM_INPUT bekommst.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: Präzisere Maussteuerung

Beitrag von Alexander Kornrumpf »

Ich weiß nicht was du machst.

Nach meinem Verständnis, kann falsch sein:

Maus mit m DPI bedeutet, wenn du die Maus ein Inch bewegst, liefert der Treiber dir m "Mickeys". Höhere Auflösungen bedeuten, das kleinere Bewegungen überhaupt registrieren, bzw. dass die gleiche Bewegung einen höheren Ausschlag verursacht. Wie du diesen Ausschlag interpretierst ist völlig dir überlassen.

Windows selbst (WM_MOUSEMOVE) rechnet in Pixel um sodass auflösungsunabhängig die gleiche physikalische Bewegung die gleiche Cursorbewegung bewirkt. Aber das ist natürlich kein Naturgesetz.

Wenn du auf Rohdaten ("Mickeys") umstellst, aber die Logik dahinter immer noch identisch ist zu den Pixeln, die dir WM_MOUSEMOVE geliefert hat, dann wird die Maus dadurch, bezogen auf Pixel, höchstens "schneller" oder "langsamer" aber nicht "genauer".

Um "genauer" zu werden musst du selbst Logik für die Umrechnung von "Mickeys" in Pixel investieren. (Das was zuvor Windows gemacht hat)
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Zudomon »

Matthias Gubisch hat geschrieben:Vielleicht solltest du einfach mal anschauen welche Werte du für WM_MOUSEMOVE und welche bei WM_INPUT bekommst.
Mache ich doch, indem ich die Ausgabe direkt verwende und mir so anschaue.
Alexander Kornrumpf hat geschrieben:Wenn du auf Rohdaten ("Mickeys") umstellst, aber die Logik dahinter immer noch identisch ist zu den Pixeln, die dir WM_MOUSEMOVE geliefert hat, dann wird die Maus dadurch, bezogen auf Pixel, höchstens "schneller" oder "langsamer" aber nicht "genauer".
Was soll ich denn da an Logik umstellen? Ich greife die Werte ab und interpretiere sie. Wenn ich die nun erstmal selbst auf Integer runden würde, dann würde ich dein Argument ja noch verstehen. Aber es kommen direkt nur Integer Werte zurück und die sind anscheinend genauso skaliert wie die von dem WM_MOUSEMOVE Event.

Kann es nicht auch sein, dass die Maus zwar präziser Arbeit bei höherer DPI, aber trotzdem nur ein Pixelergebnis zurück liefert?
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: Präzisere Maussteuerung

Beitrag von Alexander Kornrumpf »

Zudomon hat geschrieben:Aber es kommen direkt nur Integer Werte zurück
Was dich absolut nicht wundern sollte. Eigentlich war das alles was ich sagen wollte.
und die sind anscheinend genauso skaliert wie die von dem WM_MOUSEMOVE Event.
Das, und nicht dass es Integer sind, ist das einzig entscheidende. Wobei ich dir leider auch nicht weiter helfen kann. Vielleicht habe ich es komplett falsch verstanden.
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Präzisere Maussteuerung

Beitrag von Matthias Gubisch »

Zudomon hat geschrieben:
Matthias Gubisch hat geschrieben:Vielleicht solltest du einfach mal anschauen welche Werte du für WM_MOUSEMOVE und welche bei WM_INPUT bekommst.
Mache ich doch, indem ich die Ausgabe direkt verwende und mir so anschaue.
Tatsächliche Werte ansehen und Visuelle Wahrnehmung interpretieren kann oft zu völlig unterschiedlichen Ergebnissen führen.

Sind die tatsächlichen Werte gleich Skaliert -> OS schuld, vielleicht gibt es irgendwo einen geheimen Schalter....
Sind sie nicht gleich Skaliert (was ich eigentlich vermutet hätte) hast du irgendwo noch einen "Fehler" in deiner Verarbeitung oder Interpretation deiner Input Daten
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Schrompf »

Erfahrungsbericht von WM_INPUT: es kommen halt eine Serie von Messages, die man akkumuliert. Unskaliert bewegt sich damit meine Logitech-Billig-Maus langsamer als mit Windows-Mausbewegung. Das interpretiere ich so, dass ich wirklich keine hochpräzisen Mausbewegungen vom USB-Gerät bekomme, und durch die Windows-Bewegungskorrektur wahrscheinlich Bildschirmpixel bei der Bewegung überspringe. Und ich habe eine "Gamer"-Maus, die mit RawInput extrem schnell ist. Die liefert wahrscheinlich wirklich höhere Präzision. Und da WM_INPUT halt Integer sind, liefert sie nicht genauere Werte, sondern schlicht mehr Messages pro Zeiteinheit. Allerdings ist diese Maus auch mit der Windows-Mausbewegung immernoch unbenutzbar schnell - anscheinend gibt das USB-Protokoll gar nicht her, die Präzision sinnvoll abzufragen, und muss daher mit nutzergegebener Konfiguration arbeiten. Wenn man die Windows-Mausgeschwindigkeit weit genug runterschraubt, funktioniert diese Gamer-Maus dann halbwegs akzeptabel. Und dann ist sie wahrscheinlich subpixel-genau.

Für Dich übersetzt bedeutet das, glaube ich, dass Du einfach ne schlechte Maus hast :-) Und Du hast damit genauso wie Windows selbst nur die Wahl, entweder die Bewegungen weit runter zu skalieren, so dass sie schön genau ist und der Nutzer dafür das physische Gerät weite Strecken bewegen muss. Oder Du skalierst halt die Werte so, dass man angenehme Sichtsteuerung im Spiel hat und dafür nur angenehme Mengen physischer Bewegung ausführen muss, aber dann halt nicht mehr ausreichend präzise jeden Quadratzentimeter in 100m Entfernung anpeilen kann. Es ist also egal, ob Du RawInput oder WM_MouseMove nimmst.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Krishty »

So einen Thread hatten wir doch vor zwei Jahren schonmal! Hab nur keine Zeit zum Suchen. Eine 3000-DPI-Maus liefert bei der selben Bewegung einfach 30 Mal so viele WM_INPUT-Nachrichten wie eine 100-DPI-Maus. Dafür müssen Gamer dann in der Systemsteuerung die Mausgeschwindigkeit runterregeln, wie Schrompf sagt. Für die Anwenung ist das die Chance: Ist der Mausfaktor aus der Systemsteuerung (GetSystemParams, SP_MOUSESPEED oder sowas) 1 statt dem Default von 20, erhält man WM_INPUT in den 20teln eines Pixels.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4254
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Präzisere Maussteuerung

Beitrag von Chromanoid »

Stimmt ich erinnere mich auch. Hier ist glaube ich das Thema: http://zfx.info/viewtopic.php?f=4&t=2980
mrz
Beiträge: 79
Registriert: 07.08.2008, 14:34

Re: Präzisere Maussteuerung

Beitrag von mrz »

Wenn Du wirklich präzise Maussteuerung möchtest rate ich dir zu schauen wie Quake 3 (Engine-basierte) Spiele es machen
da es bei diesen ein grosses Thema ist und ich selber, als ehemaliger Hardcore Spieler, sagen kann,
dass diese es richtig gelöst haben und "keine Wünsche offen lassen".

Weil die Empfindlichkeit/Genauigkeit an sich ist nur das eine.

In den Spieleeinstellungen einfach einen Regler für "Sensitivity" (evtl noch separat für Vertikal/Horizontal)
anzubieten reicht nicht. Zumindest Hardcore Spieler haben da sehr individuelle Anforderungen.
Die Einstellungen auf OS Level bringens sowieso nicht.

Die Einstellungen hängen auch vom FOV ab, der gewählten Auflösung Ingame (und dessen Ratio, ob VSYNC ein/aus ist etc).
Eigentlich geht es noch viel weiter da es auch abhängig von der Waffe und ob man sich gerade "im Fernkampf oder Nahkampf" befindet,
welche Taktik oder Strategy man gerade aktiv spielt (attack/defense) etc etc

Q3 hat das m.M sehr cool gelöst da man für jede Taste N Commands/Settings binden kann. Ich wüsste nicht wie man es besser lösen
könnte und dazumal konnte ich alles genau so konfiguieren wie es für mich perfekt war.

z.B. konnte man für die Railgun (quasi eine Sniperwaffe) den FOV auf 90 setzen, die Mouse Sensitivity auch etwas runter setzen,
dass sieht dann etwa so aus:
/bind q "weapon 7;cg_fov 90;cg_zoomfov 110;sensitivity 2.3;cl_mouseaccel 0.18;cl_mousesenscap 5.75"

Bei anderen Waffen wie z.B. Shotgun setzte man den FOV wieder auf 120 und die Sensitivity auch wieder höher etc.

Alleine für die Maus gibt es einige Einstellungen, das waren in etwa:

/sensitivity
/m_cpi
/m_pitch
/m_yaw
/cl_mousesenscap
/cl_mouseaccel
/cl_mouseaccelOffset
/cl_mouseaccelPower

(Könnten auch noch mehr geben, habe ich aber nicht mehr im Kopf.)

Wenn dich das im Detail mehr interessiert rate ich dazu nach diesen Settings zu googlen oder direkt im Sourcecode zu schauen,
der ist ja mittlerweile public. Die Logik müsste etwa in "cl_input.c" sein, zumindest die Verarbeitung vom Event.

Bei Q3 konnte man auch einstellen ob man "raw" Input möchte (soweit ich weiss nehmen sie bei Windows "WM_INPUT")
oder DirectInput. Der Switch heisst:
/in_mouse
Antworten