Le telecamere 3D basate su Quaternione dovrebbero accumulare angoli di Quaternioni o Eulero?

StackOverflow https://stackoverflow.com/questions/319189

Domanda

Quindi ho scritto una videocamera 3D basata su Quaternion orientata verso i nuovi programmatori, quindi è estremamente facile per loro integrare e iniziare a utilizzare.

Mentre lo stavo sviluppando, inizialmente avrei preso l'input dell'utente come angoli di Eulero, quindi avrei generato un Quaternion basato sull'input per quel frame. Vorrei quindi prendere il Quaternion della Camera e moltiplicarlo per quello che abbiamo generato per l'input, e in teoria ciò dovrebbe semplicemente aggiungere la rotazione dell'input allo stato attuale della rotazione della camera, e le cose sarebbero tutte grasse e felici. Chiamiamolo così: accumulare quaternioni, perché stiamo memorizzando e aggiungendo solo quaternioni.

Ma ho notato che c'era un problema con questo metodo. Più l'ho usato, anche se ruotavo solo su un angolo di Eulero, diciamo Yaw, su alcune iterazioni, inizierebbe a sanguinare su un altro, dice Pitch. Era leggero, ma abbastanza inaccettabile.

Quindi ho fatto qualche ricerca in più e ho trovato un articolo in cui si affermava che era meglio accumulare gli angoli di Eulero, quindi la fotocamera memorizza la sua rotazione attuale come angoli di Eulero e l'input viene semplicemente aggiunto ad essi in ciascun fotogramma. Quindi genera un Quaternion da ciascuno di essi, che a sua volta viene utilizzato per generare la mia matrice di rotazione. E questo ha risolto il problema del sanguinamento della rotazione in assi impropri.

Quindi alcuni membri di Stackoverflow hanno qualche idea su questo problema? È un modo corretto di fare le cose?

È stato utile?

Soluzione

La moltiplicazione dei quaternioni soffrirà di accumulo di problemi di arrotondamento in virgola mobile (anche gli angoli semplici come 45 gradi non saranno esatti). È un ottimo modo per le rotazioni composite, ma la precisione di ciascuno dei componenti del quaternione diminuirà nel tempo. L'emorragia è un effetto collaterale, visivamente peggiore anche se il tuo quaternione potrebbe iniziare a incorporare un fattore di scala - per recuperarlo, dovresti rinormalizzare nuovamente agli angoli di Eulero in ogni caso. Un angolo di Eulero in virgola fissa non accumulerà arrotondamento.

Il ricalcolo del quaternione per fotogramma è minimo. Non mi preoccuperei di provare a ottimizzarlo. Probabilmente potresti consentire ad alcuni quaternioni di accumularsi prima di rinormalizzarti per ottenere la precisione, ma in realtà non vale la pena.

Altri suggerimenti

L'accumulazione è un processo inesatto. Accumulare molte rotazioni incrementali accumulerà un errore di arrotondamento se lo si fa con quaternioni o matrici.

Immagino qualcosa del genere: hai messo il tuo codice attivo e funzionante, ma ho notato che dopo una certa quantità di navigazione la tua videocamera si stava dando fastidio fastidiosamente - violando un invariante a cui non avevi pensato in anticipo. In effetti, ti sei reso conto che non vuoi accumulare rotazioni; invece vuoi fare qualcos'altro.

Puoi considerarlo più un problema di progettazione dell'interfaccia che un problema di precisione numerica. Fondamentalmente, le persone si aspettano che una telecamera navighi in base a inclinazione, imbardata e rollio, quindi la scelta di controllare e rappresentare direttamente gli angoli può evitare molti problemi.

Il problema qui è che i quaterion sembrano essere diventati ridondanti (almeno per questo particolare utilizzo). Tuttavia, vuoi ancora i quaternioni: l'interpolazione con gli angoli grezzi di beccheggio / imbardata / rollio può essere brutta. Ancora una volta, è una domanda di progettazione dell'interfaccia: devi capire dove avrai bisogno dei quaternioni e come farli entrare e uscire ...

Ho visto entrambi litigato per. Penso che la vera domanda che dovrai affrontare sia la flessibilità del tuo sistema di telecamere in futuro; L'imbardata IMO è generalmente più interessante in una vista in terza persona (perché ruoterai attorno all'asse verticale del personaggio). Mentre puoi discutibilmente " yaw " anche in verticale in prima persona, non sono sicuro che sia davvero la stessa cosa.

Tuttavia, penso che sia una specie di spreco ricalcolare i tuoi quaternioni per frame. Forse sarebbe meglio archiviare gli ultimi quaternioni e contrassegnarli come sporchi se il tuo frame riceve input?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top