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
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Präzisere Maussteuerung

Beitrag von Zudomon »

Also irgendwie verzweifle ich heute an einer genaueren Maussteuerung.
Und zwar habe ich bisher immer die einfache Variante genutzt. Nämlich WM_MOUSEMOVE um raus zu bekommen, wie stark die Maus bewegt wird und diesen dann in die 3D-Rotation umzusetzen. Nun ist man dabei aber auf Pixelgenauigkeit beschränkt. Nach ein bisschen Arbeit bin ich nun bei WM_INPUT angekommen. HID Device registrieren und schon bekomme ich angebliche Mausrohdaten. Aber irgendwie sind die immer noch genauso quantisiert. Nachdem ich nun in ein paar Spielen geschaut habe, ist das überall ähnlich. Sensivity etwas höher stellen und schauen, ob man dennnoch jeden Pixel anvisieren kann. Selbst bei der Source Engine hab ich mit Raw Input keine genauere Präzision.

Dann verstehe ich das ganze aber irgendwie nicht. Hab zwar nur eine "billig"-Maus von Trust, aber die soll trotzdem 3000 DPI bei 1000Hz liefern. Nun denke ich, ist da natürlich auch ein bisschen Marketing hinter, aber trotzdem sollte doch ein bisschen Sub-Pixel Bewegung möglich sein, oder nicht?!

Falls jemand nicht weiß, was ich bezwecken möchte... also man stelle sich eine Dose im 3D Spiel vor, die vielleicht 100 Meter weg ist. Nun stelle man die Maus Sensivity hoch (damit man den Negativ Effekt von dem ich rede verstärkt) und versucht die Dose anzuvisieren, ohne sich von der Stelle zu bewegen. Versucht man die Dose ins Fadenkreuz zu bringen (und man hat nicht gerade Glück, dass die Quantisierung genau darauf fällt), dann landet man immer daneben, egal wie sachte man die Maus bewegt.

EDIT: Vielleicht ist meine Maus doch fürn Arsch. Wenn ich im Windows direkt die Sensivity aufs Maximum stelle, springt die Maus auch bestimmt 4-5 Pixel...
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Top-OR »

Ha, schade, dass sich hier noch nichts bewegt – ich warte auch noch auf eine Antwort, denn ich mache genau dasselbe: WM_MOUSEMOVE auswerten.

Bisher hats für mich ausgereicht, aber ich bin mir auch bewusst, dass das nicht der Weisheit letzter Schluss wird und bisher ist es für mich seit Jahren ein Provisorium, welches aber noch für mich ausreichend gut funktioniert. Hatte bisher auch keine Zeit, mich genauer damit zu befassen.

Soweit ich das noch von „früher“ (TM) kenne, rechnet sone Mouse ja in abstrakten Einheiten:

Mickeys (http://www.webopedia.com/TERM/M/mickey.html), die die Verschiebung beschreiben. (Ist echt schwierig, nach Mickey Mouse in diesem Kontext zu googlen – Danke IT)

Für das Windows-UI sind Subpixel-Bewegungen ja weniger interessant, weswegen man wohl einen „direkteren Zugang“ zu den Mouse-Informationen benötigt, als son WM_MOUSEMOVE, was ja eher für den „ich klicke durch das Windows-UI“-Kontext gebaut ist.

Ich glaube, an der Sensitivity zu spielen, bringt da nicht weiter, sondern es ist eher eine Frage der Mouse-API. Die Rohdaten (bzw. Lower Level Data) müssten da eigentlich hilfreicher sein…
Leider habe ich auch keine Antwort bzw. einfache Lösung für dieses Problem bzw. auch keinen API-Vorschlag und behalte mir mal vor, hier leise mitzulesen und zu hoffen, dass hier demnächst ein guter Lösungsvorschlag kommt. ;-)

Das muss doch hier einer wissen bzw. schon „alle“ (außer scheinbar uns beiden) 100fach gemacht haben… Oder nicht?
--
Verallgemeinerungen sind IMMER falsch.
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Präzisere Maussteuerung

Beitrag von Matthias Gubisch »

RAW Input liefert dir doch die Rohdaten der Maus.

vielleicht hilft dir der Thread etwas weiter:
http://stackoverflow.com/questions/1046 ... th-windows
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Top-OR »

Matthias Gubisch hat geschrieben:RAW Input liefert dir doch die Rohdaten der Maus.

vielleicht hilft dir der Thread etwas weiter:
http://stackoverflow.com/questions/1046 ... th-windows
https://msdn.microsoft.com/en-us/librar ... 00%29.aspx
Ah ja... gut. Sieht nach dem aus, was ich "ahnte" und scheint relativ einfach implementierbar zu sein. Ich lege das mal zu den Akten mit dem Klebchen "demnächst mal ausprobieren".

Ich für meinen Teil bin dann mal zufrieden. :-)
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Zudomon »

@Matthias Gubisch & Top-OR
Lest meinen Eröffnungsbeitrag nochmal aufmerksam... ich habe das mit dem WM_INPUT gemacht und es hat mir 0 Verbesserung beracht. Da wohl der einzige Unterschied ist, dass die Windows Mouse Ballistics nicht drauf gerechnet werden. Ich bekomme immer noch nach wie vor nur Integer Werte für die Bewegung und die sind auch genauso quantisiert wie vorher! :evil:
Das nervt mich total!
Das blöde an der Sache ist nur, wenn ich das genauer in Spiele betrachte, haben die auch diese Quantisierung in der Eingabe. Selbst bei der Source Engine wenn man da auf RAW-Input umstellt. Also entweder ist meine Maus da einfach zu "billig" um genaueres zu liefern oder es ist ein Problem des OS. Und ich weiß einfach nicht, wie ich an noch Lowere Daten rankommen, wenn nicht über WM_INPUT... :(

Und ja, dass man nicht vernünftig nach Mickey Mouse suchen kann, au mann.
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Top-OR »

Zudomon hat geschrieben:@Matthias Gubisch & Top-OR ... Ich bekomme immer noch nach wie vor nur Integer Werte für die Bewegung und die sind auch genauso quantisiert wie vorher! ...
Moin Herr Zudo!

Zuersteinmal danke, dass du das Thema angestossen hast. Es war leider für mich immer recht weit "hinten" auf der Liste, welches irgendwie noch nie wichtig genug für mich war. Umso besser, dass es so mal in den Fokus kommt...

Bist du dir da sicher? Also, dass es Integers sind, würde mich jetzt nicht wundern. Aber dass sie wirklich genauso quantisiert sind, also "Pixel" sind (?), klingt für mich erstmal schräg ... Sicher?

Ich glaube auch nicht so recht, dass deine Maus zu billig ist. Selbst ne 10€ Maus von heute ist viel genauer als Yesterdays-100-Mark-Maus.

Ich werde in den nächsten Tagen mal damit experimentieren und meine Ergebnisse posten.
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Zudomon »

Ich bin auf dein Ergebnis gespannt! Halte uns auf jeden Fall auf den laufenden hier! :D

Zum besseren Einstieg kann ich auch gerne den Code posten:
HID anmelden

Code: Alles auswählen

procedure TInputController.Init(_hwnd: DWORD);
var
  rid: RAWINPUTDEVICE;
begin
  rid.usUsagePage:= $1;
  rid.usUsage:= $2;
  rid.dwFlags:= 0;
  rid.hwndTarget:= 0;
  RegisterRawInputDevices(@rid, 1, sizeof(rid)); 
end;
WM_INPUT verarbeiten:

Code: Alles auswählen

    WM_INPUT: begin

      GetRawInputData(HRAWINPUT(LParam), RID_INPUT, nil, dwSize, sizeof(RAWINPUTHEADER));
      if dwSize=0 then exit;
      SetLength(lpb, dwSize);

      if (GetRawInputData(HRAWINPUT(lParam), RID_INPUT, @lpb[0], dwSize, sizeof(RAWINPUTHEADER)) <> dwSize ) then begin
        ShowError('GetRawInputData does not return correct size !');
        exit;
      end;

      raw:= PRAWINPUT(@lpb[0]);

      if raw.header.dwType = RIM_TYPEMOUSE then begin
        inc(MouseRelativeDelta.x, raw.mouse.lLastX);
        inc(MouseRelativeDelta.y, raw.mouse.lLastY);
      end;

      exit;
    end; 
Vielleicht nicht ganz übersichtlich mein Code, aber einfach fragen, wenn was unklar ist... für C++ gibs da bestimmt bessere Beispiele im Netz.

Jedenfalls schäme ich mich auch, dass ich jetzt schon 16 Jahre 3D Engines baue und mich immer noch nicht um eine präzisere Maussteuerung gekümmert habe. Wäre aber der Hammer, wenn sich hier irgendwann rausstellt, dass es gar keine Möglichkeit gibt.
Es gibt natürlich Spiele, z.B. Fliegersimulatoren, wo die Mausbewegung als Beschleunigung reingerechnet wird. Da fällt dann die quantisierte Bewegung nicht auf.

Hier hab ich noch ein Paper gefunden, ich bin mir allerdings nicht sicher, ob das wirklich unser Problem hier beschreibt. Habs mir nur ganz oberflächlich angesehen bisher:
http://p.oin.name/work/subpixel.pdf
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Zudomon »

In der MSDN steht ja da noch am Ende:
https://msdn.microsoft.com/en-us/librar ... 00%29.aspx
"Overall, the best method to receive high-definition mouse movement data is WM_INPUT. If your users are just moving a mouse pointer, then consider using WM_MOUSEMOVE to avoid needing to perform pointer ballistics. Both of these window messages will work well even if the mouse isn't a high-definition mouse. By supporting high definition, Windows games can offer more precise control to users."

Vielleicht ist meine Maus wirklich nicht high-definition. Interessant finde ich übrigens, dass wenn ich im Windows die Maus Sensivity in der Systemsteuerung aufs Maximum stelle, dass ich dann auch nur quantisiert in Paint malen kann... die rote Linie ist mit 3000 dpi Mauseinstellungen gemacht... die Grüne mit 100 dpi. Die Geschwindigkeit der Maus ändert sich dadurch. Aber eigentlich hätte ich gedacht, dass sich durch die dpi Änderung eher die Quantisierung ausmerzen lässt.
compare.jpg
Zuletzt geändert von Zudomon am 18.03.2016, 12:40, insgesamt 1-mal geändert.
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: Präzisere Maussteuerung

Beitrag von Alexander Kornrumpf »

Du bist aber schon auf einem Digitalrechner unterwegs?
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Zudomon »

Alexander Kornrumpf hat geschrieben:Du bist aber schon auf einem Digitalrechner unterwegs?
Weniger Sprüche klopfen und mal selber ausprobieren. Maximale Sensivity in der Systemsteuerung und in Paint eine Linie malen! Mal sehen, ob das bei dir besser aussieht! ;)
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: Präzisere Maussteuerung

Beitrag von Alexander Kornrumpf »

Zudomon hat geschrieben:
Alexander Kornrumpf hat geschrieben:Du bist aber schon auf einem Digitalrechner unterwegs?
Weniger Sprüche klopfen und mal selber ausprobieren. Maximale Sensivity in der Systemsteuerung und in Paint eine Linie malen! Mal sehen, ob das bei dir besser aussieht! ;)
Meine Frage bezog sich darauf, wieso du erwartest in einem Digitalrechner etwas anderes als diskrete Werte zu bekommen.
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:
Alexander Kornrumpf hat geschrieben:Du bist aber schon auf einem Digitalrechner unterwegs?
Weniger Sprüche klopfen und mal selber ausprobieren. Maximale Sensivity in der Systemsteuerung und in Paint eine Linie malen! Mal sehen, ob das bei dir besser aussieht! ;)
Meine Frage bezog sich darauf, wieso du erwartest in einem Digitalrechner etwas anderes als diskrete Werte zu bekommen.
Achso, dann sorry... dachte es wäre eine Provokation auf diese grobe Quantisierung in Paint :D

Ich erwarte einfach, dass bei der Mauseingabe nicht nur ganze Pixel auf dem Desktop zählen, sondern vielleicht auch 1/10 Pixel oder 1/100 Pixel. Wie schon erwähnt macht das auf dem Desktop keinen Sinn, aber in der 3D Umgebung auf jeden Fall
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Präzisere Maussteuerung

Beitrag von Matthias Gubisch »

Zodo was erwartest du?

Paint kann nur Pixelweise arbeiten, hat mit deiner Maus gar nix zu tun.
Gleiches gilt für den Cursor, der kann halt mal nur auf einem Pixel liegen oder eben nicht, aber doch nicht halb drauf...

Egal wie genau du in der Engine rechnst, die kleinsmögliche Anzeigeeinheit wird am Ende immer in Pixel sein und bleiben.
Die größe und Menge der Pixel ist durch die Auflösung und Art deines Monitors vorgegeben.

Was du versuchst ist einen Kontinuierlichen Vorgang wie deine Bewegung auf einer Diskreten Struktur (Pixel, Qantisierungsstufen der Maus usw. ) darzustellen. Da gibt es immer Stufen, die frage ist nur wie groß diese sind. Für die Berechnung ist abgesehen von Rechengenauigkeiten die Auflösung der Maus ausschlaggeben. Für die Darstellung die Größe der Pixel.
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 »

Zudomon hat geschrieben:
Alexander Kornrumpf hat geschrieben:
Zudomon hat geschrieben:
Alexander Kornrumpf hat geschrieben:Du bist aber schon auf einem Digitalrechner unterwegs?
Weniger Sprüche klopfen und mal selber ausprobieren. Maximale Sensivity in der Systemsteuerung und in Paint eine Linie malen! Mal sehen, ob das bei dir besser aussieht! ;)
Meine Frage bezog sich darauf, wieso du erwartest in einem Digitalrechner etwas anderes als diskrete Werte zu bekommen.
Achso, dann sorry... dachte es wäre eine Provokation auf diese grobe Quantisierung in Paint :D

Ich erwarte einfach, dass bei der Mauseingabe nicht nur ganze Pixel auf dem Desktop zählen, sondern vielleicht auch 1/10 Pixel oder 1/100 Pixel. Wie schon erwähnt macht das auf dem Desktop keinen Sinn, aber in der 3D Umgebung auf jeden Fall
Die Übersetzung zwischen physikalischer Mausbewegung und logischer Cursorbewegung ist aber doch willkürlich?!

Dass man auf ein Bitmap keine Subpixellinien malen kann ist irgendwie ... klar, oder? Was soll dieser "Test" messen?
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Präzisere Maussteuerung

Beitrag von Zudomon »

Ne, moment... also das was man da in Paint sieht sind für mich keine Pixeltreppen... das ist eindeutig sowas:

(Mauseingabe in Pixel) * Sensivity
Oder genauer:
round(Mauseingabe) * Sensivity

Was ich erwarte ist aber:
round(Mauseingabe * Sensivity)
dann sollten meines Verständnisses nach sowas wie da in Paint nicht auftreten.
Und ich dachte einfach, durch die hohe DPI Zahl, lässt sich die Mauseingabe sehr genau darstellen. Aber ich bekomme die Vermutung, dass die Maus schon diese Pixelwerte an das OS sendet. Somit ist alles, was darauf aufbaut, von vornherein schon so grob aufgelöst.

Nochmal zu erklärung: Das round(x) oben im Beispiel ist so gemaint, dass die Maus Integer Werte zurück liefert. Gegen die Integer Werte habe ich nichts, aber die sollten dann nicht in Pixel, sondern in 1/100 Pixeln oder so sein.

Also was ich letztendlich erwarte ist doch keine Magie. Sondern einfach eine Subpixel Genauigkeitsmessung der Maus.
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