ad vitam aeternam
Messages postés17Date d'inscriptionjeudi 19 mai 2005StatutMembreDernière intervention10 mars 2008
-
7 avril 2007 à 08:44
ad vitam aeternam
Messages postés17Date d'inscriptionjeudi 19 mai 2005StatutMembreDernière intervention10 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.
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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.