Voglio codificare una videocamera in prima persona con la sua rotazione memorizzata in un quaternion. Sfortunatamente c'è qualcosa di sbagliato nella rotazione.Come ruotare correttamente un quaternione lungo tutti gli assi?
La seguente funzione è responsabile di ruotare la telecamera. I parametri Mouse
e Speed
passano il movimento del mouse e la velocità di rotazione. Quindi la funzione recupera il quaternario di rotazione, lo ruota e memorizza il risultato. A proposito, sto usando Bullet Physics da cui provengono i tipi e le funzioni.
void Rotate(vec2 Mouse, float Speed)
{
btTransform transform = camera->getWorldTransform();
btQuaternion rotation = transform.getRotation();
Mouse = Mouse * Speed; // apply mouse sensitivity
btQuaternion change(Mouse.y, Mouse.x, 0); // create quaternion from angles
rotation = change * rotation; // rotate camera by that
transform.setRotation(rotation);
camera->setWorldTransform(transform);
}
per illustrare la rotazione della telecamera risultante quando il mouse si muove, ti mostrano un disegno a mano. Sul lato sinistro viene mostrata la rotazione errata che la telecamera effettivamente esegue. Sul lato destro è mostrato il caso corretto desiderato. Le frecce indicano come ruota la fotocamera quando si sposta il mouse verso l'alto (in arancione) e verso il basso (in blu).
Come si può vedere, fino a quando l'imbardata è pari a zero, la rotazione è corretto. Ma più l'imbardata ha, più piccoli diventano i cerchi in cui ruota la telecamera. Al contrario, i cerchi dovrebbero sempre percorrere l'intera sfera come una longitudine.
Non ho molta familiarità con i quaternioni, quindi qui vi chiedo come ruotarli correttamente.
Le coordinate del mouse si trovano nello spazio dello schermo molto probabilmente, il che significa che non è praticamente una buona idea usarle in questo modo. Invece, convertirli in coordinate del mondo usando la matrice di proiezione inversa. – BlackCat
La mia idea era di usare le coordinate del mouse 'x' e' y' come angoli per ruotare il quaternione della telecamera attorno al vettore 'su' e' destra'. Penso che sia fatto così nella maggior parte dei giochi. Non sono sicuro che il tuo approccio funzioni. Potresti spiegare un po 'oltre? – danijar