Calcul des rotations a partir des translations

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
ebkc
Membre Naturel
Messages: 35
Enregistré le: 19 Juin 2012, 11:49

par ebkc » 21 Juin 2012, 12:43

Dlzlogic a écrit:Donc, on reprend depuis le début.
Je ne pense pas que le informations fournies par votre caméra soient en 3D. Je pense qu'elles sont en 2D.
Dans tous les cas, pouvez-vous m'envoyer un petit échantillon.
Et on ne peut que procéder que pas à pas. C'est à dire 2D ou 3D ? On verra la suite après.


ce que je recoit de la camera

c'est des message tel que suit a interval regulier :

print: /skeleton/joint/l_collar 1 0.583744 0.643656 0.823293 0
print: /skeleton/joint/l_shoulder 1 0.499344 0.579815 0.752854 1
print: /skeleton/joint/l_elbow 1 0.519506 0.726703 0.772153 0.5
print: /skeleton/joint/l_wrist 1 0.519506 0.726703 0.772153 0
print: /skeleton/joint/l_hand 1 0.529546 0.837409 0.621932 0.5
print: /skeleton/joint/l_fingertip 1 0.529546 0.837409 0.621932 0
print: /skeleton/joint/r_collar 1 0.529546 0.837409 0.621932 0
print: /skeleton/joint/r_shoulder 1 0.599938 0.58015 0.643011 1
print: /skeleton/joint/r_elbow 1 0.657876 0.563758 0.596004 0.5
print: /skeleton/joint/r_wrist 1 0.657876 0.563758 0.596004 0
print: /skeleton/joint/r_hand 1 0.603277 0.605962 0.754057 0.5
print: /skeleton/joint/r_fingertip 1 0.603277 0.605962 0.754057 0
print: /skeleton/joint/l_hip 1 0.583642 0.707215 0.986003 1
print: /skeleton/joint/l_knee 1 0.583606 0.936445 0.9849 0.5
print: /skeleton/joint/l_ankle 1 0.583606 0.936445 0.9849 0
print: /skeleton/joint/l_foot 1 0.589646 1.15648 0.969663 0.5
print: /skeleton/joint/r_hip 1 0.65205 0.707444 0.911304 1
print: /skeleton/joint/r_knee 1 0.651037 0.936668 0.909881 0.5
print: /skeleton/joint/r_ankle 1 0.651037 0.936668 0.909881 0
print: /skeleton/joint/r_foot 1 0.647996 1.15633 0.883294 0.5
print: /skeleton/joint/head 1 0.51462 0.517665 0.588192 0
print: /skeleton/joint/neck 1 0.550212 0.578898 0.706531 1
print: /skeleton/joint/torso 1 0.587052 0.642375 0.828964 1
print: /skeleton/joint/waist 1 0.587052 0.642375 0.828964 0

Du coup pour pas tout calculer d'un coup, mais ecrire la fonction d'abord,

je prends que les messages l_hand et l_shoulder

voila l'equivalent de d'une seconde de capture


print: /hand 0.570286 0.491685 0.421734
print: /shoulder 0.543153 0.580248 0.641303
print: /hand 0.570286 0.491685 0.421734
print: /shoulder 0.543634 0.579763 0.63878
print: /hand 0.570604 0.491481 0.420743
print: /shoulder 0.544221 0.578844 0.637202
print: /hand 0.570242 0.491891 0.419905
print: /shoulder 0.544221 0.578844 0.637202
print: /hand 0.570242 0.491891 0.419905
print: /shoulder 0.544529 0.580154 0.634255
print: /hand 0.570744 0.491828 0.419365
print: /shoulder 0.544525 0.580492 0.633328
print: /hand 0.571303 0.491516 0.418566
print: /shoulder 0.544525 0.580492 0.633328
print: /hand 0.571303 0.491516 0.418566
print: /shoulder 0.544926 0.579573 0.629431
print: /hand 0.571998 0.490844 0.417927
print: /shoulder 0.544803 0.577933 0.629762
print: /hand 0.572425 0.490508 0.416864
print: /shoulder 0.544803 0.577933 0.629762
print: /hand 0.572425 0.490508 0.416864
print: /shoulder 0.545425 0.578081 0.629242
print: /hand 0.573079 0.489442 0.415731
print: /shoulder 0.545897 0.578496 0.62891
print: /hand 0.573478 0.489303 0.415239
print: /shoulder 0.545897 0.578496 0.62891

l'image n'est presque la que pour faire jolie :) et voir si ca correspond bien



Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 21 Juin 2012, 13:07

en fait, tu peux pas decomposer tes trois angles selon les axes x, y et z, parce que

si tu prends ton point A.
Si tu fais tourner A par rapport a X, le repere va changer ce sera plus (O,x,y,z), mais (O,x,y2,z2)
du coup tu va pas appliquer le bon angle par rapport a y.

il faut que tu te documentes sur les angles d'euler
lire http://artemmis.univ-mrs.fr/im2/mecaspa/SCAO/EULER/euler.htm

pour trouver tes angles, tu as
http://jeux.developpez.com/faq/math/?page=transformations
"Comment générer des angles d'Euler à partir d'une matrice de rotation ?"
la vie est une fête :)

ebkc
Membre Naturel
Messages: 35
Enregistré le: 19 Juin 2012, 11:49

par ebkc » 21 Juin 2012, 13:14

Je cite ce lien http://jeux.developpez.com/faq/math/?page=transformations dans mon premier message

je n'ai pas arreté de lire des wiki et des cours sur euler et les quaternions

j'ai essayé pas mal de choses de ce cours et d'ailleurs avant de venir ici :)

du coup, generer des angles d'euler a partir de matrices de rotations j'y arrives.

pour generer ma matrice de rotation, je calcul les angles d'eulers comme decrit avec mes histoires de triangles et je convertit les angles d'euler en matrices de rotations comme decrit dans le meme cours cité plus haut. mais a l'evidence ca ne marche pas.

Comment alors generer un matrice de rotation avec les chiffres que j'ai ?

en tout cas on progresse :)




fatal_error a écrit:en fait, tu peux pas decomposer tes trois angles selon les axes x, y et z, parce que

si tu prends ton point A.
Si tu fais tourner A par rapport a X, le repere va changer ce sera plus (O,x,y,z), mais (O,x,y2,z2)
du coup tu va pas appliquer le bon angle par rapport a y.

il faut que tu te documentes sur les angles d'euler
lire http://artemmis.univ-mrs.fr/im2/mecaspa/SCAO/EULER/euler.htm

pour trouver tes angles, tu as
http://jeux.developpez.com/faq/math/?page=transformations
"Comment générer des angles d'Euler à partir d'une matrice de rotation ?"

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 21 Juin 2012, 15:05

J'ai regardé la première liste. En ne gardant que le côté gauche et les points du centre, on observe que la troisième valeur(sur 5) parait être les min et max pour pied et tête. On pourrait donc en déduire que c'est le Z. Lequel est le X et lequel est le Y ?
Que signifient la première et la dernière valeur (0 ; 1 ; 0.5) ?
La caméra est-elle munie d'un appareil de mesure de distance ?
Le personnage porte-t-il des réflecteurs sur les différents points repérés ?
Comment l'ordinateur sait-il que tel point est le coude, tel autre la tête ?
Pour quelle raison vouloir transformer des coordonnées cartésiennes en coordonnées polaires ?
Pour faire des essais, il faut tester sur un segment de longueur fixe, par exemple épaule->coude ou coude->poignet. Il faudrait un nouvel exemple avec le mouvement de tels segments.
- un vrai skelette 3D est constitué de joints, les joints doivent etres tournés, pas bougés. Ce qui est logique quand on veux garder les bonne proportions de son personnage 3D. Je crois que ca s'appel en anglais Kinematics ( voir )

Il faut donc proceder a des calculs pour savoir quel direction doit prendre chaque joint pour reproduire les mouvement de la personne devant la camera.
Ce que le fichier appelle "joint" peut, à mon avis, être traduit par "articulation", mais pour moi, ce sont des points qui ont une position à un instant donné et au moins une liaison avec un autre point.
Si ça se trouve, ce que vous cherchez à calculer est justement dans le fichier qui est affiché.

ebkc
Membre Naturel
Messages: 35
Enregistré le: 19 Juin 2012, 11:49

par ebkc » 21 Juin 2012, 16:16

La camera a un capteur special qui prends en compte les distances.

Allez savoir comment, sans marqueur sur le corp, la camera repere les points d'elle meme. C'est justement ca qui est utile !

Du coup, sur la premiere liste,

le premier parametre c'est l'id de la personne reperé par la camera, 1 dans mon cas,

les trois valeurs qui suivent sont respectivement X Y et Z.

La derniere j'ai un peu du mal a comprendre, elle est abregé "conv" je ne sais pas de quoi il sagit, mais je ne penses pas qu'elle soit tres utile.

La raison pour laquel je veux convertir d'un system a l'autre :


- sur l'ordinateur je vois des points bouger, ces points representent des points du corp. Ils se deplacent sur les axes X Y Z (j'ai donc (seulement) ces coordonées) pour suivre les mouvements du type devant la camera

...

- un vrai skelette 3D est constitué de joints(ou articulations), les joints doivent etres tournés, pas bougés. Ce qui est logique quand on veux garder les bonne proportions de son personnage 3D. Je crois que ca s'appel en anglais Kinematics



Les joints (ou articulations) sont lié entre eux par un system de parent. contairement aux donnée recue par la camera, ou ils sagit de point dans l'espace.

regardez les dessins sur ce lien en.wikipedia.org/wiki/Inverse_kinematics , je veux animer un skelette comme ca.

Et je souhaite effectuer les calculs moi meme. Le logiciel que j'utilise a deja une fonction similaire mais elle ne marche pas bien selon son developeut. Du coup l'idée c'est d'en faire une pour le plaisir de l'exercice et de la comprehension. Et puis faire avancer le logiciel si possible.


Dlzlogic a écrit:J'ai regardé la première liste. En ne gardant que le côté gauche et les points du centre, on observe que la troisième valeur(sur 5) parait être les min et max pour pied et tête. On pourrait donc en déduire que c'est le Z. Lequel est le X et lequel est le Y ?
Que signifient la première et la dernière valeur (0 ; 1 ; 0.5) ?
La caméra est-elle munie d'un appareil de mesure de distance ?
Le personnage porte-t-il des réflecteurs sur les différents points repérés ?
Comment l'ordinateur sait-il que tel point est le coude, tel autre la tête ?
Pour quelle raison vouloir transformer des coordonnées cartésiennes en coordonnées polaires ?
Pour faire des essais, il faut tester sur un segment de longueur fixe, par exemple épaule->coude ou coude->poignet. Il faudrait un nouvel exemple avec le mouvement de tels segments.
Ce que le fichier appelle "joint" peut, à mon avis, être traduit par "articulation", mais pour moi, ce sont des points qui ont une position à un instant donné et au moins une liaison avec un autre point.
Si ça se trouve, ce que vous cherchez à calculer est justement dans le fichier qui est affiché.

ebkc
Membre Naturel
Messages: 35
Enregistré le: 19 Juin 2012, 11:49

par ebkc » 21 Juin 2012, 16:21

ebkc a écrit:La camera a un capteur special qui prends en compte les distances.

Allez savoir comment, sans marqueur sur le corp, la camera repere les points d'elle meme. C'est justement ca qui est utile !

Du coup, sur la premiere liste,

le premier parametre c'est l'id de la personne reperé par la camera, 1 dans mon cas,

les trois valeurs qui suivent sont respectivement X Y et Z.

La derniere j'ai un peu du mal a comprendre, elle est abregé "conv" je ne sais pas de quoi il sagit, mais je ne penses pas qu'elle soit tres utile.

La raison pour laquel je veux convertir d'un system a l'autre :



Les joints (ou articulations) sont lié entre eux par un system de parent. contairement aux donnée recue par la camera, ou ils sagit de point dans l'espace.

regardez les dessins sur ce lien en.wikipedia.org/wiki/Inverse_kinematics , je veux animer un skelette comme ca.

Et je souhaite effectuer les calculs moi meme. Le logiciel que j'utilise a deja une fonction similaire mais elle ne marche pas bien selon son developeut. Du coup l'idée c'est d'en faire une pour le plaisir de l'exercice et de la comprehension. Et puis faire avancer le logiciel si possible.




voir ce lien :)

http://fr.wikipedia.org/wiki/Cin%C3%A9matique_inverse

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 21 Juin 2012, 18:51

Bon, si vous voulez animer le squelette, ce crains que ce soit très difficile.
Imaginez un robot à 6 pattes.
Chaque patte est liée au corps par 2 moteurs, l'un à axe vertical pour que la patte aille vers l'avant ou vers l'arrière et un à axe horizontal pour que la patte monte ou descende, c'est l'épaule. La patte a une articulation qui permet de la plier ou de l'étendre.
Les articulation d'un bras sont autrement plus compliquées. Déjà dans un robot, les deux axes de rotation ne sont pas concourants, peut-être que l'épaule est constituée d'une rotule, j'en sais rien, ce qui ferait que les axes de rotation seraient concourants, ce qui simplifierait effectivement le problème.
En tout cas, ce que je sais, c'est qu'avec un robot, bien qu'on connaisse parfaitement toutes les données, puisqu'il est construit avec des dimensions bien connues, les mouvements sont faits par des servo-moteurs dont on connait le pas de rotation, c'est déjà très difficile.

Je ne sais toujours pas comment est défini le repère des points donnés par la caméra. Votre distinction entre "tourné" et "bougé" est un peu difficile à comprendre.
Soit 1 segment, par exemple l'avant bras, si le modèle marche sans bouger les bras (le long du corps ou croisés ...) l'avant bras vas subir une translation. Si le modèle tourne sur lui-même ce même segment vas subit une rotation. Si le modèle reste assis et avance la main, l'avant bras peut subir juste une translation ou une translation de l'origine, le coude et une rotation à partir du coude, mais il est fort probable que le déplacement du coude résulte d'une rotation centrée sur l'épaule. etc.
Peut-être vous vous sentez de taille à calculer tout ça, moi pas.

Une petite révision de la trigonométrie me parait indispensable et je vous conseillerais vivement d'oublier les quaternions.
Il faut déjà bien comprendre la rotation en plan (2D) puis dans l'espace (3D), faire des changements de repère etc. C'est tout de même très difficile.

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 21 Juin 2012, 19:22

re,

alors déjà ouais le coup de la matrice de rotation pour remonter aux angles d'euler c'était foireux, puisqu'on cherche la matrice de rotation, donc on tourne en rond. Donc désolé pour cette piste

Donc: pour trouver ces angles d'euler:
Déjà on peut remarquer, qu'il n'y a pas besoin d'appliquer trois rotations, mais seulement deux.

Si on prend trois points A,B,C, on connait A et B, et les coordo de C peuvent varier.
B est le centre de rotation.
On veut trouver deux angles X et Y, tels que
A'=rot_X,B(A,x)
C=rot_Y,B(A',y)
où rot_X,B(A,x) désigne la rotation d'axe X d'angle x de centre B, appliqué sur le point A.

Visuellement, ca veut dire que : A et C sont sur une sphère de centre B.
(si ton bras est plus long, ben tu le "raccourcis" ca change rien vu que ca reste que le bras est une droite)

Donc d'abord une rotation autour de z. On considère z_A=z_B=z_C
l'angle (AB,BC) est donné par
getAngle(A,B,C)
//en considerant donc les projetés de A, B, C sur (xOy)
//produit scalaire vecteur(AB).vecteur(BC)=ABxBCxcos(Z)
Z = arccos(vecteur(AB).vecteur(BC))/(ABxBC)
//sauf qu'ici, Z est donné sur la partie supérieure du cercle trigo, alors que pe, il s'agissait de la partie inférieure cad pe
//Z = pi + (pi-Z) = 2PI - Z
//pour faire savoir, il suffit de prendre le sinus de l'angle ABC, si negatif, alors on prend 2PI-Z sinon on garde Z
//le signe du sinus est donné par
sin(Z) = vecteur(AB)xvecteur(BC)
//où vecteur(AB)xvecteur(BC) designe le produit scalaire
donc si sin(Z)>0, return Z
sinon return -Z //ou 2PI - Z modulo 2PI c'est pareil

Ensuite, tu as tourne ton point A autour de l'axe z d'un angle Z, et tu obtiens
A'=MA (avec M la matrice de rotation que chui sur tu la connais)
On a donc A',B et C qui sont coplanaires.
Il ne reste plus qu'à trouver le deuxième angle de la meme manière, mais cette fois dans le plan (A'OC)
la vie est une fête :)

Skullkid
Habitué(e)
Messages: 3075
Enregistré le: 08 Aoû 2007, 19:08

par Skullkid » 21 Juin 2012, 19:36

ebkc a écrit:quand j'applique les variables _X, _Y et _Z a la rotation d'un cube sur lui meme, son mouvement correspond, mais les directions qu'il prend ne correspondent pas, il fait aussi des tour sur lui meme quand il atteint deux angles sont 90°, ca s'appel le blocage de cadran.


Bonjour, j'arrive après la bataille, excuse-moi si je répète quelque chose qui a déjà été dit, mais pourrais-tu préciser le sens de cette phrase ? Est-ce qu'elle signifie qu'à l'issue d'un mouvement "élémentaire" (mouvement entre deux instants consécutifs où il reçoit une info de positionnement depuis le kinect) ton cube est à la bonne position mais a eu un mouvement contre-intuitif pour y arriver ? Un peu comme si sur une horloge tu voulais faire passer une aiguille du chiffre 1 au chiffre 3 en passant uniquement par le chiffre 2, mais qu'au lieu de ça l'aiguille passe par tous les chiffres de 12 à 4 ?

ebkc
Membre Naturel
Messages: 35
Enregistré le: 19 Juin 2012, 11:49

par ebkc » 21 Juin 2012, 19:42

J'ai un peu de mal a digerer le language math,

mais j'essaye, en ce moment meme je suis en train degesticuler devant ma camera avec un stylo dans ma bouche pour representer une des arrete d'une piramide a 3 coté , l'autre c'est mon corpe, et la troisieme c'est mon bras tendu. En effet je constate en analysant me propres mouvements qu'un des axe ne bouge pas... ce serait donc juste une histoire de trigo avec une piramide a 3 cotés.

Je l'impression qu'il y a des similitudes entre ce que tu dis (que je ne comprends pas tres tres precisement) et ce que je suis en train d'essayer de voir avec cette piramide (dont je ne suis pas non plus tres sur)

Mais quand tu parles de la sphere, en gros, l'epaule c'est le centre, j'ai la main sur la sphere, un point sur la vertex le long de mon corp a egal longeur que le bras, et un autre point sur la vertex le long du stylo encore a pareils distance donc sur la sphere.

Je reviens quand j'ai compris,

merci !


fatal_error a écrit:re,

alors déjà ouais le coup de la matrice de rotation pour remonter aux angles d'euler c'était foireux, puisqu'on cherche la matrice de rotation, donc on tourne en rond. Donc désolé pour cette piste

Donc: pour trouver ces angles d'euler:
Déjà on peut remarquer, qu'il n'y a pas besoin d'appliquer trois rotations, mais seulement deux.

Si on prend trois points A,B,C, on connait A et B, et les coordo de C peuvent varier.
B est le centre de rotation.
On veut trouver deux angles X et Y, tels que
A'=rot_X,B(A,x)
C=rot_Y,B(A',y)
où rot_X,B(A,x) désigne la rotation d'axe X d'angle x de centre B, appliqué sur le point A.

Visuellement, ca veut dire que : A et C sont sur une sphère de centre B.
(si ton bras est plus long, ben tu le "raccourcis" ca change rien vu que ca reste que le bras est une droite)

Donc d'abord une rotation autour de z. On considère z_A=z_B=z_C
l'angle (AB,BC) est donné par
getAngle(A,B,C)
//en considerant donc les projetés de A, B, C sur (xOy)
//produit scalaire vecteur(AB).vecteur(BC)=ABxBCxcos(Z)
Z = arccos(vecteur(AB).vecteur(BC))/(ABxBC)
//sauf qu'ici, Z est donné sur la partie supérieure du cercle trigo, alors que pe, il s'agissait de la partie inférieure cad pe
//Z = pi + (pi-Z) = 2PI - Z
//pour faire savoir, il suffit de prendre le sinus de l'angle ABC, si negatif, alors on prend 2PI-Z sinon on garde Z
//le signe du sinus est donné par
sin(Z) = vecteur(AB)xvecteur(BC)
donc si sin(Z)>0, return Z
sinon return -Z

Ensuite, tu as tourne ton point A autour de l'axe Z d'un angle Z, et tu obtiens
A'=MA (avec M la matrice de rotation que chui sur tu la connais)
On a donc A',B et C qui sont coplanaires.
Il ne reste plus qu'à trouver l'angle de la meme manière, mais cette fois dans le plan (A'OC)

ebkc
Membre Naturel
Messages: 35
Enregistré le: 19 Juin 2012, 11:49

par ebkc » 21 Juin 2012, 19:45

Skullkid a écrit:Bonjour, j'arrive après la bataille, excuse-moi si je répète quelque chose qui a déjà été dit, mais pourrais-tu préciser le sens de cette phrase ? Est-ce qu'elle signifie qu'à l'issue d'un mouvement "élémentaire" (mouvement entre deux instants consécutifs où il reçoit une info de positionnement depuis le kinect) ton cube est à la bonne position mais a eu un mouvement contre-intuitif pour y arriver ? Un peu comme si sur une horloge tu voulais faire passer une aiguille du chiffre 1 au chiffre 3 en passant uniquement par le chiffre 2, mais qu'au lieu de ça l'aiguille passe par tous les chiffres de 12 à 4 ?


La bataille n'est pas finie !!!

C'est a peu pres ca oui, ce que j'essaye de decrire a une page wiki : http://fr.wikipedia.org/wiki/Blocage_de_cardan

Si ce n'est pas mon probleme en tout cas tes descriptions, et celle de wiki, correspondent quand meme.

Skullkid
Habitué(e)
Messages: 3075
Enregistré le: 08 Aoû 2007, 19:08

par Skullkid » 21 Juin 2012, 20:00

C'est-à-dire que c'est un peu dur sans pouvoir comparer visuellement les mouvements que tu fais et ceux que le cube reproduire, mais comme, si j'ai bien compris, tu as recopié un code censé être écrit exprès pour corriger le gimbal lock, je me dis que c'est peut-être un autre type de problème...

Donc, aux instants où la caméra envoie les infos de position, le cube a la bonne position et la bonne orientation, c'est le mouvement entre ces points qui déconne parfois. On est d'accord ?

Dis-moi si ce qui suit est juste :

Le programme que tu utilises pour animer ton cube reçoit à intervalles temporels réguliers 3 angles de rotation, que tu as appelés _X, _Y et _Z, qui correspondent aux angles des rotations à effectuer autour de trois axes fixes (_X, _Y et _Z ne sont pas les angles d'Euler) pour passer d'une position de référence (bras tendu le long de l'axe vertical, donc pas nécessairement la position du bras à l'instant précédent) à la position courante. Ton programme s'arrange ensuite pour produire le mouvement qui fait passer de l'ancienne position (_X1,_Y1,_Z1) à la nouvelle (_X2,_Y2,_Z2). En gros, il ne fait pas qu'afficher successivement les deux images du cube correspondant à l'ancienne et la nouvelle position, mais calcule des images intermédiaires pour rendre le visuel plus agréable.

ebkc
Membre Naturel
Messages: 35
Enregistré le: 19 Juin 2012, 11:49

par ebkc » 21 Juin 2012, 20:55

Alors ... je penses que expliquer juste avec les mots, vu tout ce qu'on a deja dit, c'est pas facile, mais je vais reprendre l'exemple tres simple un peu plus haut(en relisant je remarque qu'il en maquait la moitié ...)

On a deux cube.

Le Cube A
position x = 0, y =0, z=0;
rotation x = 0, y = 0, z = 0;

et le cube B
position X = 9, y = 12, z = 7;
rotation x = 0, y = 0, z = 0;

C'est toutes les infos que j'ai !!!

Je veux que le cube A regarde le cube B (c-a-d que sa face avant pointe vers le cube B), ou plutot connaitre le calcul qui me permet de determiner les angles X Y Z a appliquer au cube A pour qu'il regarde le B. (Je ne parle donc pas du mouvement)

Si moi j'ai ca qui fonctionne apres je vous montrerais des screenshots de l'installation complete, avec le rendu, et l'application de ce truc, mais meme moi je sais pas encore tres bien ce que je vais faire. En tout cas sur ce topic, je veux trouver cette formule !

Fatal_error a bien dicérné mon probleme je crois, et il m'a lancé sur une voie que j'essaye d'ailleurs encore de digerer.

Skullkid a écrit:C'est-à-dire que c'est un peu dur sans pouvoir comparer visuellement les mouvements que tu fais et ceux que le cube reproduire, mais comme, si j'ai bien compris, tu as recopié un code censé être écrit exprès pour corriger le gimbal lock, je me dis que c'est peut-être un autre type de problème...

Donc, aux instants où la caméra envoie les infos de position, le cube a la bonne position et la bonne orientation, c'est le mouvement entre ces points qui déconne parfois. On est d'accord ?

Dis-moi si ce qui suit est juste :

Le programme que tu utilises pour animer ton cube reçoit à intervalles temporels réguliers 3 angles de rotation, que tu as appelés _X, _Y et _Z, qui correspondent aux angles des rotations à effectuer autour de trois axes fixes (_X, _Y et _Z ne sont pas les angles d'Euler) pour passer d'une position de référence (bras tendu le long de l'axe vertical, donc pas nécessairement la position du bras à l'instant précédent) à la position courante. Ton programme s'arrange ensuite pour produire le mouvement qui fait passer de l'ancienne position (_X1,_Y1,_Z1) à la nouvelle (_X2,_Y2,_Z2). En gros, il ne fait pas qu'afficher successivement les deux images du cube correspondant à l'ancienne et la nouvelle position, mais calcule des images intermédiaires pour rendre le visuel plus agréable.

Skullkid
Habitué(e)
Messages: 3075
Enregistré le: 08 Aoû 2007, 19:08

par Skullkid » 21 Juin 2012, 21:13

ebkc a écrit:Je veux que le cube A regarde le cube B (c-a-d que sa face avant pointe vers le cube B), ou plutot connaitre le calcul qui me permet de determiner les angles X Y Z a appliquer au cube A pour qu'il regarde le B. (Je ne parle donc pas du mouvement)


Qu'appelles-tu la face avant ? Rappelle-toi qu'on n'a pas d'image sous les yeux donc dès que tu utilises des mots comme "avant", "arrière", "gauche" ou "droite", on risque d'avoir des problèmes de compréhension... Aussi, par "regarder le cube B", tu veux juste qu'il regarde vers le point (9,12,7), n'est-ce pas ? Le fait qu'il y a un cube autour de ce point n'importe pas ?

Quoi qu'il en soit, tu ne parles pas du mouvement que le cube A doit faire entre la position initiale et la position finale où il regarde le cube B. Tu veux juste calculer les 3 angles pour obtenir la position finale.

Et les 3 angles que tu veux, ce sont les angles d'Euler, qui concernent des rotations autour d'axes qui bougent avec ton cube, ou des angles de rotation autour des axes fixes sur lesquels tu lis les coordonnées de translation ?

Désolé de te faire répéter mais c'est pour essayer d'avoir l'image la plus claire possible.

ebkc
Membre Naturel
Messages: 35
Enregistré le: 19 Juin 2012, 11:49

par ebkc » 21 Juin 2012, 22:51

Alors !

Fatal_error je reprends ton message bout par bout, parce que j'ai un peu de mal.

fatal_error a écrit:re,

alors déjà ouais le coup de la matrice de rotation pour remonter aux angles d'euler c'était foireux, puisqu'on cherche la matrice de rotation, donc on tourne en rond. Donc désolé pour cette piste



Okay !

Donc: pour trouver ces angles d'euler:
Déjà on peut remarquer, qu'il n'y a pas besoin d'appliquer trois rotations, mais seulement deux.


J'ai cru comprendre ca en essayant de visualiser mentalement

Si on prend trois points A,B,C, on connait A et B, et les coordo de C peuvent varier.
B est le centre de rotation.
On veut trouver deux angles X et Y, tels que
A'=rot_X,B(A,x)
C=rot_Y,B(A',y)
où rot_X,B(A,x) désigne la rotation d'axe X d'angle x de centre B, appliqué sur le point A.

Visuellement, ca veut dire que : A et C sont sur une sphère de centre B.
(si ton bras est plus long, ben tu le "raccourcis" ca change rien vu que ca reste que le bras est une droite)



Pourquoi on essaye de calculer X et Z ? sur ton schema ils correspondent a A(point virtuel) et C(la main) or c'est l'angle du centre de rotation(l'epaule) qui m'interesse non ?


Donc d'abord une rotation autour de z. On considère z_A=z_B=z_C
l'angle (AB,BC) est donné par
getAngle(A,B,C)
//en considerant donc les projetés de A, B, C sur (xOy)
//produit scalaire vecteur(AB).vecteur(BC)=ABxBCxcos(Z)
Z = arccos(vecteur(AB).vecteur(BC))/(ABxBC)



la je ne comprends plus,

on reparle de l'angle AB,BC,

tu cite ma fonction, mais avec 3 parametre ?

z_A,z_B,etz_C sont egaux ? mais ce sont des angles ou points du triangle ?

Qu'est ce que O (dans(mais aussi...) xOy) ? et le terme projeté ?

mais j'ai l'impression que ce que tu explique ressemble a ma fonction getAngle


//sauf qu'ici, Z est donné sur la partie supérieure du cercle trigo, alors que pe, il s'agissait de la partie inférieure cad pe
//Z = pi + (pi-Z) = 2PI - Z
//pour faire savoir, il suffit de prendre le sinus de l'angle ABC, si negatif, alors on prend 2PI-Z sinon on garde Z
//le signe du sinus est donné par
sin(Z) = vecteur(AB)xvecteur(BC)
//où vecteur(AB)xvecteur(BC) designe le produit scalaire
donc si sin(Z)>0, return Z
sinon return -Z //ou 2PI - Z modulo 2PI c'est pareil


Ca je comprends l'utilité meme si pratiquement je suis pas encore la

Ensuite, tu as tourne ton point A autour de l'axe z d'un angle Z, et tu obtiens
A'=MA (avec M la matrice de rotation que chui sur tu la connais)
On a donc A',B et C qui sont coplanaires.
Il ne reste plus qu'à trouver le deuxième angle de la meme manière, mais cette fois dans le plan (A'OC)


Pour le reste avec la matrice de rotation ca devrait aller mieux. mais il faudra bien que je fasse une convertion aux angles d'euler a ce moment ?

Ca fait un peu bloc de questions ... c'est qu'il me manque beaucoup de notion, je ne connais pas mes classiques :)

Quoi qu'il en soit je continu a essayer de comprendre et d'avancer, merci encore !!

ebkc
Membre Naturel
Messages: 35
Enregistré le: 19 Juin 2012, 11:49

par ebkc » 21 Juin 2012, 23:04

@Skullkid:

La premiere image,

c'est ce que j'ai, mes deux cubes

la deuxieme c'est ce que je vaux qu'il fasse,

j'ai fais les captures dans un soft de 3D, il y a une fonction target (cible), j'ai dit cube 1 cible cube B.

Pour bien comprendre les cubes on la face avant rouge et arriere bleu;

Image

Skullkid a écrit:Qu'appelles-tu la face avant ? Rappelle-toi qu'on n'a pas d'image sous les yeux donc dès que tu utilises des mots comme "avant", "arrière", "gauche" ou "droite", on risque d'avoir des problèmes de compréhension... Aussi, par "regarder le cube B", tu veux juste qu'il regarde vers le point (9,12,7), n'est-ce pas ? Le fait qu'il y a un cube autour de ce point n'importe pas ?

Quoi qu'il en soit, tu ne parles pas du mouvement que le cube A doit faire entre la position initiale et la position finale où il regarde le cube B. Tu veux juste calculer les 3 angles pour obtenir la position finale.

Et les 3 angles que tu veux, ce sont les angles d'Euler, qui concernent des rotations autour d'axes qui bougent avec ton cube, ou des angles de rotation autour des axes fixes sur lesquels tu lis les coordonnées de translation ?

Désolé de te faire répéter mais c'est pour essayer d'avoir l'image la plus claire possible.

Skullkid
Habitué(e)
Messages: 3075
Enregistré le: 08 Aoû 2007, 19:08

par Skullkid » 22 Juin 2012, 00:00

Merci pour l'image, ça aide à visualiser comment sont tes axes. Mais j'aimerais quand même énormément que tu répondes à la question que je t'ai déjà posée, car la réponse est capitale pour ma compréhension des choses : les angles que tu cherches sont-ils ceux de rotations autour des trois axes fixes (les axes bleu, vert et rouge sur ton image) ou autour d'axes mobiles (c'est-à-dire les angles d'Euler) ?

En gros l'autre problème que j'ai en tête depuis mon premier post, à part le gimbal lock, c'est les sauts de phase de la fonction arctan. Ce problème ne peut apparaître que si ton programme, en plus de calculer des positions successives, calcule les mouvements à effectuer entre ces positions. D'où mon petit texte au post d'avant, que je n'ai pas réussi à te faire confirmer ou infirmer. Ma question sur les angles est importante car le gimbal lock ne peut pas se produire si tu fais tes rotations autour des trois axes fixes (et on peut pas t'aider à calculer des angles si on ne sait pas de quels angles il s'agit).

ebkc
Membre Naturel
Messages: 35
Enregistré le: 19 Juin 2012, 11:49

par ebkc » 22 Juin 2012, 00:19

Hello skullkid,

alors quand je dis faire une rotation sur un cube c'est par rapport a son centre, sur lui meme, pas sur 0,0,0. Je n'avais pas bien fait la nuance mais si c'est ca alors il sagit d'euler.

Le but n'est pas de calculer les mouvements.

Et avec ce que me fit fatal_error je crois bien que le probleme est avant le fix du gimbal lock, dans ma fonction pour calculer les angles.

Le truc par rapport a ses expliquations, et a tout ce que je lis en math a ce propos, c'est que je ne comprends les math qu'en language de developement. Ca s'ecrit comme sur une calculette simple, en lignes. Je comprends pas les signes au dela de * / + - et quelques basiques. Ca prends plus de temps mais ca avance quand meme :)


Skullkid a écrit:Merci pour l'image, ça aide à visualiser comment sont tes axes. Mais j'aimerais quand même énormément que tu répondes à la question que je t'ai déjà posée, car la réponse est capitale pour ma compréhension des choses : les angles que tu cherches sont-ils ceux de rotations autour des trois axes fixes (les axes bleu, vert et rouge sur ton image) ou autour d'axes mobiles (c'est-à-dire les angles d'Euler) ?

En gros l'autre problème que j'ai en tête depuis mon premier post, à part le gimbal lock, c'est les sauts de phase de la fonction arctan. Ce problème ne peut apparaître que si ton programme, en plus de calculer des positions successives, calcule les mouvements à effectuer entre ces positions. D'où mon petit texte au post d'avant, que je n'ai pas réussi à te faire confirmer ou infirmer. Ma question sur les angles est importante car le gimbal lock ne peut pas se produire si tu fais tes rotations autour des trois axes fixes (et on peut pas t'aider à calculer des angles si on ne sait pas de quels angles il s'agit).

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 22 Juin 2012, 07:01

salut skullkid, en relisant ce matin

Comment alors generer un matrice de rotation avec les chiffres que j'ai ?


Je pense que ebkc s'en tape des angles d'euler ou autre, ce qu'il désire c'est trouver une matrice M, telle que:
On note A et B les centres des cubes cubeA et cubeB.
est la direction dans laquelle le cube cubeA doit pointer vers cubeB
est la direction actuelle dans laquelle pointe le cube A (sur le schéma (0,0,-1))

Et M est telle que

avec colinéaire à de même sens
la vie est une fête :)

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 22 Juin 2012, 07:54

et voilà un bout de code (octave/matlab)
Code: Tout sélectionner
function r=getAngle(A,B,C)
% B is center of rotation
  ba=A-B;
  bc=C-B;
  r=acos(ba*bc'/(norm(ba,2)*norm(bc,2)));
  r*=sign(ba(1)*bc(2)-ba(2)*bc(1));
end




clear;
F=[1 0 0];%center of front face of A
A=[0 0 0];%center of cube A
B=[0 1 2];%center of cubeB


a=getAngle(F(1:2),A(1:2),B(1:2));
M=[
  cos(a)   -sin(a)  0;
  sin(a)   cos(a)   0;
  0         0       1
];
F2=M*F'
% after one rotation F2 is in plane (F2AB)
% change the repere
r=getAngle([1,0],[0,0],B(1:2))
R=[
  cos(r)   -sin(r)  0;
  sin(r)   cos(r)   0;
  0         0       1
];
F2=inv(R)*F2;
B2=inv(R)*B';
%then rotate once more in plan (F2AB) around y' axis
b=getAngle([F2(1) F2(3)],[A(1) A(3)],[B2(1) B2(3)]);
b*180/pi
M2=[
  cos(b) 0    -sin(b);
  0      1    0;
  sin(b) 0    cos(b)
];
B3=M2*F2;
AB_Direction=R*B3;
%we should point toward same direction as AB
%idem AB_Direction/norm(AB_Direction,2) . AB = 1
AB=B-A;
AB/=norm(AB,2);
AB*AB_Direction/norm(AB_Direction,2)




la vie est une fête :)

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 32 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite