Matrice View DirectX

BobTSMSI Messages postés 60 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 2 mars 2007 - 1 mars 2007 à 17:13
AnteManoclis Messages postés 154 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 6 septembre 2007 - 2 mars 2007 à 20:03
Salut tout le monde!

Bon c'est pas faute d'avoir cherché mais j'ai un problème de 3D avec DirectX 8... Je débute sous Direct3D alors vous pourrez peut-être m'expliquer...

Mon prob c'est de faire bouger le point de vue de la scène... Je comprend le principe de transformation par des matrices... Je cherche à faire une caméra totalement libre sur les trois axes en rotation et en translation... Je précise que les axes sont les axes du repère de la caméra biensûr pas ceux du repère de la scène...

Ma méthode: J'initialise une matrice identité, je lui applique successivement 3 rotations pour les 3 axes puis une translation... La translation semble fonctionner impec mais les rotations nada....

Voici mon code:

 
       D3DXMatrixIdentity matView
        D3DXMatrixRotationAxis matRoll, MVertex(matView.m13, matView.m23, matView.m33), camRoll * (pi / 180)
        D3DXMatrixMultiply matView, matRoll, matView
        D3DXMatrixRotationAxis matPitch, MVertex(matView.m11, matView.m21, matView.m31), camPitch * (pi / 180)
        D3DXMatrixMultiply matView, matPitch, matView
        D3DXMatrixRotationAxis matYaw, MVertex(matView.m12, matView.m22, matView.m32), camYaw * (pi / 180)
        D3DXMatrixMultiply matView, matYaw, matView
        transX = camRight * matView.m11 + camUp * matView.m12 + camLook * matView.m13
        transY = camRight * matView.m21 + camUp * matView.m22 + camLook * matView.m23
        transZ = camRight * matView.m31 + camUp * matView.m32 + camLook * matView.m33
        D3DXMatrixTranslation matTrans, transX, transY, transZ
        D3DXMatrixMultiply matView, matTrans, matView
        d3dDevice.SetTransform D3DTS_VIEW, matView

Voilà...

Donc camRoll, camPitch et camYaw bah c'est pour les angles de rotation et puis camRight, camUp et camLook c'est pour la translation... Tout ça s'exécute dans la boucle principale. La translation semble fonctionner comme il faut mais curieusement la rotation donne l'impression que les objets tournent autour du point (0,0,0) alors que je voudrais qu'ils tournent par rapport à la position de la caméra.... Je sèche.... Trois jours que je cherche et rien...

Merci d'avance pour votre aide!!

3 réponses

AnteManoclis Messages postés 154 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 6 septembre 2007
1 mars 2007 à 19:37
Salut,

Je pense qu'en ajoutant une translation à ta matrice de vue qui correspondrait à la position de la caméra, ton point (0,0,0) autour duquel tes objets tournent, deviendrait au final l'origine de ta caméra.

Tchô AnteManoclis
0
BobTSMSI Messages postés 60 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 2 mars 2007
1 mars 2007 à 19:47
Oui mais j'ai une translation vers la position de ma caméra est dans le code que j'ai posté:

        transX = camRight * matView.m11 + camUp * matView.m12 + camLook * matView.m13
        transY = camRight * matView.m21 + camUp * matView.m22 + camLook * matView.m23
        transZ = camRight * matView.m31 + camUp * matView.m32 + camLook * matView.m33
        D3DXMatrixTranslation matTrans, transX, transY, transZ
        D3DXMatrixMultiply matView, matTrans, matView

Tu parles de cette translation?
0
AnteManoclis Messages postés 154 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 6 septembre 2007
2 mars 2007 à 20:03
Ben j'en sais rien en fait, je sais pas trop à quoi elle correspond cette translation, camRight, camUp et camLook je ne sais pas bien à quoi correspondent ces trois variables...
Ce que j'ai compris de ton premier message, c'est que la rotation que tu effectues se passe autour de l'origine. De mon point de vue, c'est normal, quand tu appliques une rotation, c'est toujours le repère qui sert de référence, alors mon idée était la suivante : en ajoutant une translation à ta matrice "générale" (et cela même s'il y en a déjà une, c'est pas grave), tu "déplaces" l'ensemble du repère, et par conséquent, l'origine aussi. Alors une rotation autour d'un point (x, y, z) revient à une rotation autour de (0, 0, 0) à laquelle tu vas ajouter une translation de vecteur (x, y, z).

Tchô AnteManoclis
0
Rejoignez-nous