Pagina 1 di 1

Calibrazione leve analogiche joypad

Inviato: lun 16 giu 2008, 10:17
da Blizzard
Salve,
stavo codando il sistema di input per il gioco e ho notato che le leve analogiche del joypad che stavo usando (tramite il KControlCenter) erano mal calibrate a differenza del paddle.
Vorrei sapere se c'è un modo per calibrarle, altrimenti nella versione linux mi sa che devo togliere di default il supporto all'analogico oppure implementare una calibrazione che comunque mi farebbe perdere un po di sensibilità negli angoli dove è orientato il cursone (e un aumento della sensibilità negli altri angoli).
Comunque una calibrazione di massima è fattibile ma sarei interessato se è possibile eseguirla con gli strumenti di sistema per andare più sicuro... e risparmiare codice :badgrin:

ciao
Gio

Re: Calibrazione leve analogiche joypad

Inviato: lun 16 giu 2008, 11:07
da lyapunov
Interessante.....Non so come fare con gli strumenti di sistema ma via software potresti semplicemente in fase di avvio del gioco registrare gli offset di spostamento dei vari assi (a leva centrata) e sottrarli di volta in volta ai valori in input.
Spero di essere stato chiaro...

Re: Calibrazione leve analogiche joypad

Inviato: lun 16 giu 2008, 11:20
da Blizzard
lyapunov ha scritto:Interessante.....Non so come fare con gli strumenti di sistema ma via software potresti semplicemente in fase di avvio del gioco registrare gli offset di spostamento dei vari assi (a leva centrata) e sottrarli di volta in volta ai valori in input.
Spero di essere stato chiaro...
mmm ... solo sottrazione :-k , preferisco lavorare di interpolazione.
Ti faccio fare la calibrazione toccando gli angoli e poi registro le distanze dal centro sfasato. In pratica poi eseguo si la sottrazione ma poi faccio il clamp dei valori tra 0 e 1.
In questo modo se è sfasata in alto ad esempio avrò in alto un rilevamento di valori tra ~-8000 e ~-32000 e in basso tra ~-8000 e ~32000.
Poi ovviamente porto tutto tra 0 e 1 ma come puoi capire la sensibilità aumenta verso il basso e diminuisce verso l'alto e questo mi snerva un po. Ma se non si trova altra soluzione è sempre meglio di niente.

Ciao
Gio

Re: Calibrazione leve analogiche joypad

Inviato: lun 16 giu 2008, 11:50
da lyapunov
Non ho capito bene cosa vuoi fare anche perchè non conosco quali valori ti da in uscita il joystick (ho ipotizzato che ti desse dei valori di spostamento su assi x e y perpendicolari tra loro).
Se proprio vuoi fare le cose per bene puoi fare così:

Ipotizziamo una sensibilità lineare del joystick s (s_x per l'asse x e s_y per l'asse y). In questo caso i valori che il controller invia al pc sono nella forma:

x = a_x*s_x + o_x
y = a_y*s_y + o_y

dove o_x o_y sono l'offset a joy centrato e fermo e a_x e a_y sono le posizioni del joy nello spazio (per esempio a_x = 1 a_y = 1 se è messo nell'angolo in alto a dx e a_x = -1 e a_y = -1 se è messo nell'angolo in basso a sx).
A questo punto puoi a controller fermo registrare i valori o_x e o_y. Dopo di chè ti metti di volta in volta nei quattro angoli ottenendo 4 valori per a_x, 4 per a_y (che conosci perchè sai in quale angolo sei) e 4 per x e 4 per y che vai a prendere leggendo cosa il tuo joy spedisce al pc.
A questo punto hai che

s_x = (x - o_x)/a_x
s_y = (y - o_y)/a_y

in realtà hai 4 valori per ciascuna equazione sopra scritta. A questo punto puoi interpolare e ottieni così s_x e s_y.

Questa procedura di calibrazione è quella standard che si segue in fase di calibrazione di sensori con una costante di calibrazione lineare.

Ciau..

Re: Calibrazione leve analogiche joypad

Inviato: lun 16 giu 2008, 12:53
da Blizzard
ciao,
praticamente stiamo dicendo la stessa cosa, solo che prima me l'avevi presentata come semplice sottrazione del nuovo centro al valore di movimento.

In pratica il joypad analogico restituisce 2 valori (ciascuno per ogni asse) che vanno da -32k a +32k (non so se questo dato cambia per ogni pad ma in generale è così).
Pertanto supponiamo che il centro sia sfalzato a (-1000,-1000) ovvero leggermente in alto a sinistra. In questo caso la massima posizione che il pad può assumere in alto a sinistra è sempre (-32k,-32k) però come puoi immaginare lo spostamento non è stato v(-32k,-32k) ma v1(-32k-(-1000) , -32k-(-1000)).
Spostando la leva nell'angolo in basso a destra ovviamente procedendo come prima avremo uno spostamento di v(32k,32k) ma il punto toccato in basso a destra è (32k-1000 , 32k-1000) perchè il centro è sfalsato.

A questo punto rilevo che sull'asse x ad esempio ho uno spostamento positivo di 32k (verso destra) ed uno negativo di 32k-1000 (verso sinistra). Quindi risolvo tutto praticamente simile a come hai spiegato ora effettuando il clamp del valore di spostamento attuale tra -1e 1 (scusa avevo scritto tra 0 e 1 prima) ovvero ex:

centro c=(-1000,-1000)
spostamento_massimo_sx=~-31000;
spostamento_massimo_dx=~32000;

valore_attuale_x < c.x
valore spostamento x =(valore_attuale + c.x) / spostamento_massimo_sx;

valore_attuale_x > c.x
valore spostamento x =(valore_attuale - c.x) / spostamento_massimo_dx;

in pratica se ho capito bene diciamo quasi la stessa cosa

ciao
Gio