[DirectX] Quaternion... encore trop flou

Le côté programmation du développement d'un jeu vidéo.

Quaternion... encore trop flou

Messagepar Kinju » 15 Déc 2005, 22:39

Bonjour à tous,

Jusqu'à présent, je travaillais avec des Yaw, des Pitch, et des Roll.

A présent, j'ai modifié pour travailler avec un quaternion.

Seulement je comprend le principe: un axe définit, et une rotation autour de cette axe d'un angle définit.

Mais à quoi correspondent les composantes x, y, z et w?

J'ai fait un p'tit test, j'ai capturé des touches de mon clavier pour modifier chacune des valeurs du quaternion et avoir le résultat en temps réel.
Bon, ça tourne, quand on tourne trop, ça s'agrandir ou ça rapticie...

Autre question, comment vous définissez un quaternion? J'ai vu que c'était en rapport avec des nombres complexes... Mais vous calculez manuellement les valeurs des composantes à chaque fois ou y'a des méhodes récurrentes à appeler?

Merci,

A bientôt :)
Kinju
Hello World, I'm new !
 
Messages: 60
Inscription: 19 Nov 2005, 08:12

Messagepar Loulou » 16 Déc 2005, 10:20

Il y a des formules à connaître pour manipuler les quaternions. Tu en trouveras pas mal sur la FAQ des Matrices et Quaternions (-> Google).
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar Kinju » 16 Déc 2005, 11:50

Ha ok, merci LouLou.

En fait c'est pour faire évoluer ma voiture sur le sol.
J'ai vu une fonction intéressante:

D3DXQUATERNIONRotationAxis(D3DXQUATERNION * pOut,CONST D3DXVECTOR3 * pV, FLOAT Angle);

Je me suis dit "facil, j'ai plus qu'à définir la normale du sol pour les axes, et l'angle ça sera mon pitch local"

Ben nan:
D3DXQuaternionRotationAxis(&_orientation, &normale, _direction);
Lorsque le sol est plat (donc normale = 0.0f, 1.0f, 0.0f)) ça marche très bien. J'ai plus qu'à faire évoluer le flottant "direction" pour le faire tourner.

Parcontre, j'ai fait une pente et là c'est pas brillant.
La normale de cette pente est (0.0f, 20000.0f, -15000.0f), la direction est de 0.0f, et pourtant la voiture reste droite :s

Pour moi cette fonction elle oriente la voiture dans l'axe définit, et ensuite elle tourne autour de autant de radian définit... Mais aparemment c'est pas le cas :s

Désolé LouLou pour le "_" :p

A bientôt ;)
Kinju
Hello World, I'm new !
 
Messages: 60
Inscription: 19 Nov 2005, 08:12

Messagepar Kinju » 16 Déc 2005, 14:05

j'ai trouvé un truc mais bon...

Je fait un quaternion par axe, puis je les multipli pour donner le quaternion final...

Ca m'étonnerai que ça soit programmement correct... et en plus ça implique des calcul de cosinus et sinus sur la normale... autant faire avec Yaw Pitch et Roll
Kinju
Hello World, I'm new !
 
Messages: 60
Inscription: 19 Nov 2005, 08:12

Messagepar Lenolian » 16 Déc 2005, 14:28

Le quaternion n'oriente pas l'objet il ne fait que le tourner autour d'un axe arbitraire.
J'ai toujours raison, même quand j'ai tort car alors j'ai raison d'avoir tort.
Avatar de l’utilisateur
Lenolian
Hello World, I'm new !
 
Messages: 799
Inscription: 10 Avr 2005, 16:17
Localisation: Toulouse

Messagepar Kinju » 16 Déc 2005, 14:34

ha ok d'accord...

Je comprend mieux l'effet que j'obtient..

Seulement, pour obtenir l'effet que je veux... comment je doit m'y prendre? (orienter un objet sur l'orientation du pente depuis la normale de cette dernière)
Kinju
Hello World, I'm new !
 
Messages: 60
Inscription: 19 Nov 2005, 08:12

Messagepar Lenolian » 16 Déc 2005, 15:43

Ce que je voulais dire c'est que quand tu définissais ton quaternion avec un vecteur (0.0f, 20000.0f, -15000.0f) et un angle de rotation nul, c'est normal que ton objet ne soit pas tourner.

Quant tu définis un quaternion avec un axe v(x,y,z) et angle t, ton quaternion ressemble a çà :

q.X = sin(t/2) * x
q.Y = sin(t/2) * y
q.Z = sin(t/2) * z
q.W = cos(t/2)

Si ton angle vaut 0 alors q.X = q.Y = q.Z = 0, et q.W = 1. Il n'y a donc pas d'effet sur l'objet.

Du point de vue rotation, quaternion et matrice sont identiques. Seul le formalisme change. Pour représenter une rotation dans un espace à 3 dimensions il faut une matrice 3x3 (soit 9 composantes), alors qu'avec un quaternion il n'en faut que 4. Soit un gain de temps considérable pour les calculs informatique. Essayes de définir ta rotation en terme de matrice puis transforme la en quaternion, au moins au début histoire de mieux appréhender ce qui se passe. Après quand tu seras à l'aise tu pourras utiliser les quaternions directement.
J'ai toujours raison, même quand j'ai tort car alors j'ai raison d'avoir tort.
Avatar de l’utilisateur
Lenolian
Hello World, I'm new !
 
Messages: 799
Inscription: 10 Avr 2005, 16:17
Localisation: Toulouse

Messagepar Kinju » 16 Déc 2005, 16:03

Bah en fait, j'ai déjà fait avec les matrices. Mais j'ai vu que les quaternion se servaient d'un axe et d'un angle, donc idéale pour faire évoluer un objet sur un plan.

Code: Tout sélectionner
plan:
   1         3
    \        /
      \/   /   /  /
     /  \/__/_ /__ 2
__/___ _/__/____



Voilà, c'est ma pente. En fait, on a la normale (1) y'a plus qu'à récupérer l'axe de rotation (2). Quant à l'angle, c'est l'angle de la pente, récupérable via la normale après l'avoir normalisé. Une fois ça récupéré, on peut utiliser
D3DXQuaternionRotationAxis avec comme axe le 2, et l'angle correspondant à la pente.

Jusque là j'ai bon?

Comment récupérer l'axe 2?
Kinju
Hello World, I'm new !
 
Messages: 60
Inscription: 19 Nov 2005, 08:12

Messagepar Kinju » 16 Déc 2005, 20:45

Oula, mon shéma au dessus il est complètement naze...

M'enfin, j'ai fait un truc qui fonctionne:

//Le quaternion lié au cap de la voiture sur l'axe de la normale au sol
D3DXQUATERNION cap;
//On le fait tourner autour de la normale
D3DXQuaternionRotationAxis(&cap, &normale, _direction);

//la direction actuelle de la voiture, dans son repère local
D3DXVECTOR3 dir = D3DXVECTOR3(sinf(_direction), 0.0f, cosf(_direction));
//l'axe autour duquel on va le faire tourner
D3DXVECTOR3 axe;
//l'axe, c'est le produit vectoriel de la normale, et de la direction de la voiture
D3DXVec3Cross(&axe, &dir, &normale);

//On fait tourner la voiture selon la "pente" du plan
D3DXQuaternionRotationAxis(&_orientation, &axe, -atan(normale.z/normale.y));

//On fait faire de l'amour aux deux orientations
D3DXQuaternionMultiply(&_orientation, &cap, &_orientation);
//Et on normalize sinon la voiture elle rétrécit/s'agradit
D3DXQuaternionNormalize(&_orientation, &_orientation);

Alors ça ça marche, sur une pente dans une certaine direction, j'ai pas encore testé si la pente était dirigée autrement, normalement ça fonctionne pas mais bon, j'vais tester et généraliser à toutes les pentes du monde (aussi bien les petites que les grandes, les dodu, les poilu, les rondelettes, toutes). A mon avis faut juste changer le calcul de l'angle dans la rotation autour de la normale...

M'enfin à part ça, est-ce que c'est correct comme code?

Merci :)

A bientôt
Kinju
Hello World, I'm new !
 
Messages: 60
Inscription: 19 Nov 2005, 08:12


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Yahoo [Bot] et 16 invités

cron