Qual è il modo più semplice per implementare una telecamera di terza persona in C ++ / DirectX9


8

Sono abbastanza nuovo in C ++ e DirectX9 e voglio implementare una fotocamera in terza persona. Dopo aver letto delle telecamere basate su Quaternion, ho deciso di provare a implementarlo. Ma mi fa davvero impazzire, quindi chiedo qui qual è il modo più semplice per implementare una TP-Camera?

Ecco le cose che la fotocamera dovrebbe fare:

  • Segui le coordinate memorizzate in un 3DVector (x, y, z)

  • Ruota attorno all'oggetto (Smooth)

  • Forse un qualche tipo di "molla" = Ritorna lentamente alla posizione normale dietro all'oggetto dopo aver ruotato

Mi scuso per il mio pessimo inglese: sono tedesco e ancora a scuola!

Grazie in anticipo!

MODIFICARE:

Dopo aver provato, ce l'ho.

Il problema più grande che ho preso in considerazione è stato l'estrazione corretta del vettore "direction" dalla World-Matrix.

Durante la mia ricerca ho trovato principalmente qualcosa del genere:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
direction.y = worldMatrix->_23;
direction.z = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Questo NON funziona per me! Invece ho fatto questo:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
// Consider the .y after the .z!
direction.z = worldMatrix->_23;
direction.y = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Per il ridimensionamento:

// The tenfold of the average distance
D3DXVec3Scale(&direction, &direction, 10.0f);

Impostazione delle posizioni:

cameraPos = targetPos - direction;
// For a top-view
cameraPos.y = targetPos.y + 5;

Per Rotations dovresti creare una World-Matrix temporanea (dalla posizione del bersaglio) e ruotarla come vuoi ed estrarre la direzione.

Il Smoothing of the Rotation dipende davvero dal TUO gioco!

Questo tipo di fotocamera in terza persona è davvero facile da realizzare e fa il suo lavoro!

Davvero GRANDE grazie a "jheriko" che mi ha dato la risposta giusta!


+1 per descrivere effettivamente ciò di cui hai bisogno, è raro (anche se potrebbe essere più dettagliato, ad esempio il 3 ° punto è confuso - non hai implicato che sta ruotando liberamente?).
Wondra,

Sì, dovrebbe ruotare liberamente ma voglio che torni lentamente al punto nella parte posteriore del giocatore dopo che la rotazione è terminata!
Anonimo Anonimo

Risposte:


1

Ciò che ti aiuterà è avere la matrice di trasformazione per l'oggetto che vuoi seguire. Puoi estrarre il vettore futuro da questa matrice - a seconda del sistema di coordinate e della mano della matrice questa sarà una delle righe o colonne con il 4o componente rimosso (supponendo che tu usi matrici di trasformazione 4x4, senza fattori di scala - i fattori di scala sono orribili per molte ragioni ... ma se hai fattori di scala puoi normalizzare la riga / colonna dopo aver rimosso il 4 ° componente.)

Una volta ottenuto questo, puoi posizionare la videocamera direttamente dietro l'oggetto sottraendola dalla posizione dell'oggetto. Per spostare dentro e fuori la telecamera è possibile ridimensionare il vettore e ruotare attorno all'oggetto è possibile effettuare una rotazione xey (o xz / zy ecc. A seconda della mano, ecc.) Che si applica a una copia della matrice oggetto prima di estrarre la direzione in avanti.

Infine, per rendere più fluido il movimento, la soluzione più semplice è quella di tracciare l'offset e gli angoli precedenti e spostarsi verso di loro di una quantità dipendente dal framerate descritta da un ^ (b.dt) dove dt è il tempo delta e a, b sono i parametri scelti. a = 0.9 eb = 30 ti dà l'effetto di spostarti del 90% verso la posizione come se lo stessi facendo ogni fotogramma a 30 fps. questo si chiama filtro "risposta all'impulso infinito" ed è un trucco classico per questo tipo di smoothing.

questo potrebbe non essere l'ideale, potresti voler scegliere una distanza minima e limitare anche gli angoli, altrimenti la telecamera potrebbe passare attraverso l'oggetto. se sei all'interno di un mondo denso, anche il ritaglio o la dissolvenza di oggetti intermedi diventa importante.

scusate se è lungo, ma non è un problema banale, come sembra aver scoperto.

spero che sia di aiuto. posso fornire maggiori dettagli se necessario.

(ps nessun quaternione necessario - non aiutano davvero per questo problema)


Grazie mille! Mi hai dato alcune idee su come farlo. Ma apprezzerei alcuni esempi di codice, se non ti dispiace. E perché non usare i quaternioni? Ho letto che sono comunemente usati per fare questo tipo di cose ( en.wikipedia.org/wiki/Quaternion ).
Anonimo Anonimo il

Ho provato a farlo come hai descritto, ma ho ancora alcuni problemi. La Telecamera non è nella parte posteriore del Giocatore in modo arrogante, ma almeno da qualche parte al suo fianco! Non capisco la parte con le rotazioni X e Y: cosa dovrebbe essere ruotato? La matrice mondiale, il vettore di direzione o una copia del vettore di posizione del giocatore? E come ruotare? Spero che tu mi possa aiutare!
Anonimo Anonimo il

ruotate il vettore di direzione o la matrice da cui lo estraete (la matrice di trasformazione dell'oggetto, non il mondo o la matrice della vista) per ruotare le matrici di rotazione degli angoli degli assi e moltiplicarle, oppure utilizzare la trigonometria ...
jheriko
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.