Rotation directX

ad vitam aeternam Messages postés 17 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 10 mars 2008 - 7 avril 2007 à 08:44
ad vitam aeternam Messages postés 17 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 10 mars 2008 - 7 avril 2007 à 17:02
Bonjour à tous!

Voici ma question; en directX, je programme la rotation de ma caméra mais celle-ci tourne selon l'axe passant par les points de ses axes et non sur elle-même. Je ne suis pas sur de l'expliquer comme il faut mais je pense que vous comprenez; elle fait un grand rond au lieu de tourner sur elle même

voici le code que j'utilise;

Public Sub Camera()

Dim mattemp As D3DMATRIX
Dim mattemp2 As D3DMATRIX
Dim mattemp3 As D3DMATRIX

'<D3DXMatrixRotationY> rotate la matrice selon l'axe Y
'paramètre: - matrice à remplir avec les résultas
'           - angle à affecter à la rotation
D3DXMatrixRotationY mattemp2, -angleY

'<D3DMatrixTranslation> translate la matrice
'paramètre: - matrice à remplir avec les résultats
'           - déplacement demandé selon X
'           - déplacement demandé selon Y
'           - déplacement demandé selon Z
D3DXMatrixTranslation mattemp, 0, 0, 0

'<D3DMatrixMultiply> multiplie des matrices entre elles
'paramètre: - matrice à remplir avec les résultats
'           - matrice à multiplier
'           - matrice multiplicative
D3DXMatrixMultiply mattemp2, mattemp, mattemp2

'<D3DXMatrixRotationX> rotate la matrice selon l'axe X
'paramètre: - matrice à remplir avec les résultas
'           - angle à affecter à la rotation
D3DXMatrixRotationX mattemp3, -angleX

'<D3DMatrixMultiply> multiplie des matrices entre elles
'paramètre: - matrice à remplir avec les résultats
'           - matrice à multiplier
'           - matrice multiplicative
D3DXMatrixMultiply mattemp3, mattemp2, mattemp3

'<D3DMatrixLookAtLH> : permet de remplir la matrice indiqué avec des paramètres caméras;
'paramètres: - nom de la matrice à remplir
'            - vecteur indiquant la position de la camera
'            - vecteur indiquant la cible de la camera
'            - vecteur indiquant la verticale de la camera
D3DXMatrixLookAtLH matview, VecteurPositionCamera, VecteurCibleCamera, VecteurUPCamera 'calcul de la matrice vue avec les vecteurs

'<D3DMatrixMultiply> multiplie des matrices entre elles
'paramètre: - matrice à remplir avec les résultats
'           - matrice à multiplier
'           - matrice multiplicative
D3DXMatrixMultiply matview, mattemp3, matview

'<SetTransform>: Applique les données de la matrice indiquée sur l'objet indiqué:
'paramètres:    - objet dont on veut tranformer les caractéristiques
'               - matrice contenant les paramètres à appliquer
'Note: Ici on applique les données de matcamera à l'objet <D3DTS_VIEW>; l'objet camera de directX
Direct3DDevice8.SetTransform D3DTS_WORLD, matview

'<D3DMatrixPerspectiveFovLH> : fonction de paramètre de l'objectif camera qui applique à la matrice indiquée les paramètres indiqués;
'paramètres:    - matrice à remplir
'               - coefficient de zoom (une division de PI; plus PI/x est petit plus le zoom est important
'               - coefficient de dilatation; x>1   :dilatation horizontale
'                                            0<x<1 :dilatation verticale
'               - coefficient
'               - distance maximale filmée (en pixels)
D3DXMatrixPerspectiveFovLH matproj, 3.1415 / 5, 1, 0.1, 500 'Matrice de projection

'Note: Ici <SetTransform> transforme le paramètre <DEDTS_PROJECTION> (caractéristique de l'objectif camera)
'      avec les paramètres de la matrice matproj
Direct3DDevice8.SetTransform D3DTS_PROJECTION, matproj

Et là je pense qu'il faudrait une translation quelque part, genre D3DMatrixTranslation mais j'ai beau essayé plein de truc je n'y arrive pas.

Quelqu'un aurait-il une idée?

Merci d'avance!

ad'

2 réponses

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
7 avril 2007 à 16:44
En fait, ce que je ne comprends pas, c'est pourquoi tu t'évertues à faire bouger le monde alors qu'il suffit de changer la direction de la caméra.
Tu as ton vecteur position et ton vecteur cible pour ta caméra.
Tu peux avoir un vecteur cible relatif à la la position de la caméra :
cibleRel = cible - position
Ensuite tu vas faire ton application linéaire (matrice) de rotation selon ton axe :
(J'utilise managedDirectx et je ne suis plus habitué à la vieille nomenclature, excuse-moi si ce n'est pas tout à fait ça)
dim matRotation as matrix
D3DMatrixRotationAxis matRotation, axis, angle

Puis tu fais tourner ton vecteur :
(En managedDirectX, il y a vector3.TransformCoordinate, il doit y avoir un équivalent en directx 8)
cibleRel = Vector3.TransformCoordinate(cibleRel, matRotation)

Et enfin, on remet la cible à sa place :
cible = cibleRel + position

Et tu n'as plus qu'à appliquer cela à ta vue :
D3DXMatrixLookAtLH matview, position, cible, VecteurUPCamera

Si tu ne te rappelle plus bien de tes cours d'algèbres , je te conseille de visiter cette page, ainsi que les autres parlant de matrices et d'applications linéaires.

<hr size="2" width="100%" />Julien.
0
ad vitam aeternam Messages postés 17 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 10 mars 2008
7 avril 2007 à 17:02
J'ai essayé mais rien n'y fait!

Je ne comprends pas, je ne dois pas utiliser les bonnes commandes!

Merci tout de même!
ad'
0
Rejoignez-nous