Sviluppo software che converte l'input di movimento in input del mouse reattivo e preciso, oltre a mantenere un sito Web che cerca di aiutare gli sviluppatori a implementare soluzioni ugualmente valide. In genere sconsiglio le soglie di movimento, anche se dipende da quanta reattività e precisione desiderano i giocatori, sono contento che funzioni per te nella tua situazione. Ma qui offrirò una soluzione diversa:
Uso qualcosa che si chiama Smooth Tiered Smoothing . L'idea è che deviamo l'input attraverso diversi algoritmi di smoothing a seconda della grandezza attuale della velocità del giroscopio (in pratica, uno di quegli algoritmi di smoothing è semplicemente "nessun smoothing"). Questa è la parte "a più livelli". La parte "soft" è che possiamo effettivamente dividere uniformemente l'input tra diversi algoritmi di smoothing a seconda di come si confronta con 2 soglie.
Conserva lo spostamento correttamente e non aggiunge alcun ritardo ai movimenti rapidi.
In pratica, hai due soglie. Quando l'entità della velocità di input è inferiore alla soglia inferiore, stiamo usando un semplice algoritmo di smoothing (media su più frame). Quando è maggiore dell'altra soglia, non utilizziamo affatto alcun algoritmo di smoothing. Ma in questo caso, stiamo ancora passando zeri all'algoritmo di livellamento della soglia inferiore.
Quando la velocità di input è tra le due soglie, dividiamo di conseguenza l'input tra i due algoritmi.
Ecco un frammento dell'articolo sopra:
GetSoftTieredSmoothedInput(Vec2 input, float threshold1, float threshold2) {
// this will be length(input) for vectors
float inputMagnitude = Abs(input);
float directWeight = (inputMagnitude - threshold1) / (threshold2 - threshold1);
directWeight = clamp(directWeight, 0, 1);
return GetDirectInput(input * directWeight) +
GetSmoothedInput(input * (1.0 - directWeight));
}
GetDirectInput restituisce semplicemente ciò che gli è stato dato, ma è per mostrare che qui potrebbe essere usato un altro algoritmo di smoothing. GetSmoothedInput prende una velocità e restituisce una velocità levigata.
Con Soft Smoothed Smoothing non viene applicato alcun livellamento a movimenti ovviamente intenzionali (sopra la soglia maggiore), viene applicato un livellamento per coprire piccole quantità di jitter, che influirà anche su movimenti molto piccoli, ma quando si ottengono le soglie giuste non è molto evidente. E c'è una transizione molto fluida tra i due (senza la quale, il jitter può essere effettivamente amplificato).
Mentre le altre risposte hanno ragione a dire che è difficile riconoscere il jitter nell'istante in cui viene ricevuto un input, è anche vero che il jitter è quasi sempre una velocità molto bassa e il ritardo di input che viene fornito con il smoothing è molto meno evidente per gli input a bassa velocità .
Come menziona l'articolo, questo è usato in un paio di punti nel mio strumento open source JoyShockMapper , un mappatore di input che trasforma l'input giroscopico in input del mouse. Anche per le persone che usano altri strumenti di rimappatura come Steam o reWASD, alcuni usano JoyShockMapper allo stesso tempo solo per i suoi controlli giroscopici.
Questa risposta presuppone che l'ingresso sia dato in velocità angolare (che è comune con i controller che hanno controlli di movimento), non un orientamento assoluto (che suona come il Razer Hydra ti sta dando). Con l'orientamento assoluto, la mia speranza è che tu possa usare la differenza tra l'orientamento corrente e l'orientamento precedentemente riportato per ottenere una velocità, ma non so per certo se funzionerà così come con i controller che riportano da sé la velocità angolare .
Una soluzione di livellamento comune quando si ha a che fare con una posizione / orientamento assoluto piuttosto che con le velocità è interpolare nel tempo verso l'orientamento dell'obiettivo - questo è descritto in dettaglio molto utile in questo articolo di Gamasutra. Questo può funzionare anche con il livellamento graduale morbido. Calcolerai la grandezza della velocità usando la differenza tra questo input e quello precedente riportato. Applica la differenza di orientamento tra questo frame e l'ultimo frame moltiplicata per il valore "directWeight" calcolato nello snippet sopra. L'ultimo passaggio consiste nell'aggiungere l'input livellato, ma a causa del modo in cui funziona il livellamento dell'orientamento interpolato, basta applicare la modifica dell'orientamento interpolato come al solito - non è necessario considerare "directWeight". Basta impostare l'orientamento del target (questo è ciò a cui si interpola con il livellamento descritto nell'articolo Gamasutra) a qualsiasi orientamento si stia ottenendo dal dispositivo e interpolare l'orientamento verso di esso come descritto in quell'articolo.