Bonjour,
J'ai lu la FAQ sur les quaternion, et il y a pas mal de chose que je ne comprend pas et que j'aimerais comprendre =(
Je vous explique mon problème.
J'ai une sphère, représentant une petite planète
et J'ai un joueur (pour l'instant un cube) qui tourne autour de cette sphère (a altitude constante), qui peut se diriger à sa guise, je me suis rendu fou sur un algorithme pour pouvoir le bouger efficacement, maintenant c'est fait.
Donc pour l'instant le cube tourne correctement autour de la planète, mais ne tourne pas, normal puisque mon algo définit juste la position (x,y,z) dans le repère de base.
Mon joueur est une classe à part.
Pour vous en dire un peu plus, car ça serviras peut être pour ma question, en interne mon joueur à un vecteur directeur, un vecteur up (collièaire au vecteur partant du centre de la sphère et arrivant à la position du joueur, mais normalisé), c'est 2 vecteurs sont perpendiculaire (désolé je ne sais plus le mot pour des vecteur), donc avec le produit vectoriel, cela forme un joli repère locale pour mon joueur.
je voudrais maintenant utiliser les quaternions, pour que le joueur tourne lorsqu'on avance ou lorsqu'on change de direction.
Je peux connaitre l'angle de rotation dans le repère local du joueur, lorsq'on avance et se dirige également puisque je calcule la future position grace aux angles, mais à la main, cependant je connait l'angle exact.
Comment faire alors?
mon code de transformation actuel ressemble à ça :
J'ai essayer d'implémenter l'idée ci dessus :
En fesant comme ça, le mesh se déforme, et tourne 2 fois trop vite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 void Player::SetTransform(LPDIRECT3DDEVICE9 pDEV){ D3DXMATRIX matWorld; D3DXMATRIX matTranslation; D3DXMATRIX matRotation; //Translate OK D3DXMatrixTranslation( &matTranslation, x, y, z ); //Rotate en cours .... D3DXVECTOR3 vCross; D3DXVec3Cross(&vCross,&Vdir,&Vup); D3DXVec3Normalize(&vCross,&vCross); D3DXQUATERNION qx, qy, qz, qt, QRot; //Construction des Quat avec le repere locale et les angles locaux qx=D3DXQUATERNION(Vdir.x, Vdir.y, Vdir.z, 0.0f); qy=D3DXQUATERNION(vCross.x, vCross.y, vCross.z, rotAvance); qz=D3DXQUATERNION(Vup.x, Vup.y, Vup.z, rotDirection); D3DXQuaternionMultiply(&qt, &qx, &qy); D3DXQuaternionMultiply(&QRot, &qt, &qz); //Conversion en Matrice D3DXMatrixRotationQuaternion( &matRotation, &QRot ); //Calcul MatriceWorld matWorld =matRotation * matTranslation; pDEV->SetTransform( D3DTS_WORLD, &matWorld ); }
rotDirection est l'angle qu'il fait en se dirigeant (autour de Vup)
rotAvance est l'angle qu'il fait en avançant, (autour de Vcross)
Merci pour votre aide
Ryan
Partager