Definizione nella matrice di visualizzazione Direct3D quando la telecamera si muove costantemente

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

  •  05-07-2019
  •  | 
  •  

Domanda

Nella mia applicazione Direct3D, la fotocamera può essere spostata usando il mouse o i tasti freccia. Ma se codifico (0,1,0) come vettore verso l'alto in LookAtLH , la cornice diventa vuota in alcuni orientamenti della videocamera.

Ho appena imparato a mie spese che, guardando lungo l'asse Y, (0,1,0) non funziona più come la direzione Su (sembra ovvio?). Sto pensando di cambiare la mia direzione verso qualcos'altro per ognuno di questi casi speciali. C'è un modo più grazioso di gestirlo?

È stato utile?

Soluzione

Supponendo che tu possa calcolare un vettore che punta in avanti (cosa stai guardando - la tua posizione) e un vettore che punta a destra (sempre sul piano XZ a meno che tu non possa rotolare). Normalizza entrambi questi vettori, quindi su è avanti x destra (dove x è un prodotto incrociato).

In generale, puoi collegare la tua imbardata, inclinare e rotolare in una matrice di rotazione e ruotare i vettori degli assi per andare avanti, avanti e indietro, ma immagino che sia quello che stai usando LookAtLH per evitare.

Vedi http://en.wikipedia.org/wiki/Rotation_matrix#The_3- dimensional_rotation_matricies

Altri suggerimenti

Il modo grazioso di gestirlo è usare Unit Quaternions. Un quaternione è un vettore di 4 valori che codifica un orientamento nello spazio 3D (non una rotazione come affermano alcuni articoli) e un'unità quaternione è quella in cui la lunghezza del vettore sqrt (x ^ 2 + y ^ 2 + z ^ 2 + w ^ 2) è 1.0. Esistono una serie di operazioni matematiche per lavorare con i quaternioni che sono analoghe all'uso delle matrici per codificare le rotazioni, con l'ulteriore vantaggio che i quaternioni non possono mai rappresentare un orientamento degenerato. Puoi convertire liberamente i quaternioni in una matrice 3x3 o 4x4 quando devi alimentare il risultato a una GPU.

Il tuo problema è che, mentre sposti la fotocamera, introdurrai una piccola svolta nella direzione verso l'alto della fotocamera. Obbligando la videocamera a ricentrarsi sul vettore (0,1,0) ad ogni iterazione, si sta effettivamente ruotando la videocamera e quindi bloccando l'orientamento della videocamera per rimanere sulla superficie di una sfera, ma quando la videocamera colpisce il polo di questa sfera non esiste una buona direzione per chiamare "up" e la tua matrice diventa singolare e ti dà poligoni di dimensioni zero (da cui lo schermo nero). I quaternioni hanno la capacità di interpolare attraverso questi poli ed uscire bene dall'altra parte, lasciandoti sempre una matrice valida. tutto ciò che devi fare è controllare il "twist".

Per misurare questa svolta, leggi l'articolo di Ken Shoemake "Riduzione della torsione del fascio di fibre" nel libro Graphics Gems 4. Mostra un buon modo per misurare questo colpo di scena accumulato e come rimuoverlo quando è offensivo.

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