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

Calcul des rotations a partir des translations

par ebkc » 19 Juin 2012, 12:15

Salut les matheux !

Je viens vous voir ca j'ai un ptit probleme de math ... et comme j'ai pas été au dela de la 3eme ca coince un peu ...

En gros j'ai un kinect, pour ceux qui ne savent pas c'est une camera 3D qui envoi a l'ordi les coordonées de translation XYZ des points representant mon corp (main, coude, epaule, torse, genou, tete,......), ca donne un truc un peu comme ca http://b.vimeocdn.com/ts/117/658/117658478_640.jpg

Or en 3D, pour animer le skelete d'un personnage les joints preferent etre tournés(rotation) que depalcés(translations), car sinon ca deforme pas mal le model, c'est pas fait pour quoi.

Du coup je me suis mis en tete de pondre un algo qui va me faire ca, et je penses que j'ai pas mal avancé, mieux que ca, dans la bonne voie ! Mais arrivé a la fin, j'ai des comportement erratiques. Du coup je me dis que j'ai merdé quelquepart.

Donc en gros pour l'exercice j'essaye de calculer l'angle de mon bras droit. j'ai donc les coordoné XYZ de mon epaule, et pareils pour la main.

Dans un premier temps, avec de la trigo, je transforme donc ces positions en rotations pour chaque axe avec ce code

(a : main, b : epaule);

BC = (a.x-b.x);
AB = (a.y-b.y);
AC = sqrt((AB*AB)+(BC*BC));
BD = AC - AB;
YY = atan(AB/BC)+atan(BD/BC)
X = (YY*180/PI)*2

j'ai donc X Y Z a 360°, en reapliquant ces infos a la roation d'un cube, il ne tourne pas comme mon bras. quand j'atteins des 90 ou 180° il tourne sur lui meme, change de sens, ou que sais je.

Apres des petites recherches en ligne j'ai decouvert que la 3D a besoin d'un reper en plus sinon les angles se croisent et ca fait nimporte quoi, ca s'appel le Gimbal Lock. voir article tres itneressant http://jeux.developpez.com/faq/math/?page=transformations#Q34b.

Il faut donc pour regler ce probleme si j'ai bien compris, convertir les angles d'euler en quaternion, et les reconvertir en angles d'euler, avec une petite condition a un moment sensée corrigé l'erreur.

Sur l'article il y a un exemple de code, que j'ai recuperé et teste, mais mon cube ne tourne toujours pas dans le bon sens. Apres verif su un calculateur en ligne euler/quaternion/euleur, en comparant ses resultats avec les miens, il s'avere que mes resultats ne correspondent pas dans un cas, celui du Gimbal Lock (cos(Y) > 0.005 (donc Y = 90°)).

J'ai donc readapté mon code pour qu'il colle avec celui du comparateur en ligne, mais malheuresement, LE CUBE NE TOURNE TOUJOURS PAS DANS LE BON SENS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Du coup je me dis que sois, c'est la premiere partie de mon code qui calcul les angles qui foire(mais ca n'a pas l'air), sois c'est le Gimbal lock fix(et ca n'a pas l'air non plus mais je comprends moins bien), sois une troisieme option que j'ignore.

Je me tourne donc vers vous. Voila les sources (un peu modifiés mais toujours correctes) selon l'article cité plus haut. J'ai aussi celle que j'ai modifié par rapport au calculateur en ligne, mais elles sont moins lisibles ...

la partie dans if (Math.abs(C) > 0.005) a l'air de marcher,

c'est plutot celle du "else" qui qui peche normalement.

Code: Tout sélectionner

var RADIANS = 180/3.14159;

var _X = 20;
var _Y = 90;
var _Z = 100;

var C,X,Y,Z,RX,RY;
var cos_X,cos_Y,cos_Z,sin_X,sin_Y,sin_Z;

sin_Y = Math.sin(_Y/RADIANS);
cos_X = Math.cos(_X/RADIANS);
cos_Z = Math.cos(_Z/RADIANS);
sin_X = Math.sin(_X/RADIANS);
sin_Z = Math.sin(_Z/RADIANS);
cos_Y = Math.cos(_Y/RADIANS);

Y = -Math.asin(-sin_Y);
C = Math.cos(Y);
Y *= RADIANS;
      
if (Math.abs(C) > 0.005) {

      RX = (cos_X*cos_Y)/ C
      RY = -(-sin_X*cos_Y)/ C
      
      X = Math.atan2(RY,RX);
      X *= RADIANS;
      
      RX = (cos_Y*cos_Z)/ C
      RY = -(-cos_Y*sin_Z)/ C
      
      Z = Math.atan2(RY,RX);
      Z *= RADIANS;
      
}else{


   X = 0;
   
   RX = ((sin_X*sin_Y)*sin_Z)+(cos_X*cos_Z);
   RY = -(sin_X*sin_Y)*cos_Z+cos_X*sin_Z;

   Z = Math.atan2(RX,RY);
   Z *= RADIANS;
   
}

trace("x: "+X);
trace("y: "+Y);
trace("z: "+Z);



Voila j'espere qu'une bonne ame pourra m'aider en ligne,

et si quelqu'un est sur Paris et veut venir me filer un coup de main se sera avec plaisirs



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

par Dlzlogic » 19 Juin 2012, 13:07

Bonjour,
Je vous conseille de reposer et donc de redéfinir le problème.
1- on a une suite d'images ...
2- on identifie des points ...
3- on veut modéliser des déplacements artificiels de ces points
4- on veut les représenter
5- etc.

Je vois que vous faites souvent référence à des angles, cela sous-entent, soit que vous avez une mesure d'angle, soit quelque-chose qui a besoin d'un angle, comme un servo-moteur.
Par exemple, que représentent 20°, 90°, 100° ?

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

par ebkc » 19 Juin 2012, 20:20

Bonsoir Dlzlogic,

Le probleme posé a son etat premier est le suivant

je recois en temps reel les coordonnées de translation XYZ d'une suite de points representant sous forme de skelette. (main, coude, epaule, pied, genou, ....) la personne qui bouge devant ma camera Kinect.

J'ai un personnage en 3D, riggé(c-a-d que le model suivra les mouvements du skelette/rig qui va avec), ses dimentions sont donc fixe.

Mon objectif est donc de lui communiquer a chaque joints les coordonnées de rotation en degres correspondant a celle de la personne devant la camera, il faut donc transformer les translationsXYZ en rotationXYZ.

j'ai pour la premiere partie (calcul des angles a partir des positions) fait quelques brouillons avant de coder. Pour la deuxieme partie je me suis basé sur un cours sur un site cité plus haut. J'ai procédé logiquement jusqu'au bout, et je suis maintenant bel et bien bloqué ...

20 90 et 100 correspondent a des valeurs test de X Y et Z, mais dans son application, l'algorythme recoit des valeurs a interval regulier.


Dlzlogic a écrit:Bonjour,
Je vous conseille de reposer et donc de redéfinir le problème.
1- on a une suite d'images ...
2- on identifie des points ...
3- on veut modéliser des déplacements artificiels de ces points
4- on veut les représenter
5- etc.

Je vois que vous faites souvent référence à des angles, cela sous-entent, soit que vous avez une mesure d'angle, soit quelque-chose qui a besoin d'un angle, comme un servo-moteur.
Par exemple, que représentent 20°, 90°, 100° ?

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

par Dlzlogic » 20 Juin 2012, 11:59

Bonjour,
Il faudrait d'abord que l'on se mette d'accord sur les termes.
Squelette : ensemble de points (coude, épaule, main) reliés éventuellement par des segments de droite. Ces points peuvent être centre de rotation d'un segment par rapport à l'autre.
Ces points sont connus à chaque instant par leurs coordonnées dans le plan de la prise de vue.

Vous employez les termes "translation" et "rotation" avec une signification que je ne comprend pas.

Il est possible, mais je n'en sais rien, qu'il soit intéressant de faire intervenir la rotation du bras avec l'épaule comme axe de rotation et la rotation de l'avant-bras avec le coude comme axe de rotation, encore faut-il définir une direction de référence.

(a : main, b : epaule);

BC = (a.x-b.x);
AB = (a.y-b.y);
AC = sqrt((AB*AB)+(BC*BC));
BD = AC - AB;
YY = atan(AB/BC)+atan(BD/BC)
X = (YY*180/PI)*2
Je n'ai pas compris ce calcul. Que représente BD, différence de 2 longueurs qui ne sont pas portées par la même direction?

J'ai l'impression que vous voulez transformer une série de points dont on connait à chaque instant la position en projection dans le plan vertical, en une série de points dans un espace 3D en profitant du fait que la distance entre 2 points liés par un segment est constante par construction. Si c'est ça, ça va être difficile.

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

par ebkc » 20 Juin 2012, 13:47

Bonjour !

Merci de prendre le temps pour essayer de comprendre mon probleme.

le mot "translation" est utilisé en 3D pour designer la position.

Je crois que dans des termes tres simple pour expliquer mon but : je veux orienter(donc faire une rotation) un point vers un autre point , dans un espace en 3 dimentions, avec pour seul elements connus leurs positions dans l'espace 3D (donc XYZ).


la premiere partie du code est une fonction que j'utilise 3 fois, une pour chaque angle

elle est utilisée comme ca

Code: Tout sélectionner
function getAngle(AB,BC) {

AC = sqrt((AB*AB)+(BC*BC));
BD = AC - AB;
angle = atan(AB/BC)+atan(BD/BC)
angle = ( angle *180/PI)*2
return angle%360; // modulo 360

}

_X = getAngle((main.x- epaule.x),( main.y- epaule.y) );
_Y = getAngle(( main.x- epaule.x),( main.z- epaule.z) );
_Z = getAngle(( main.y- epaule.y),( main.z- epaule.z) );


Sur ce dessin brouillon je represente le shema utilisé pour la fonction, le nom des points correspondent a ceux du code.

Image

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.

Image

pour palier a ce probleme il faut si j'ai bien compris convertir les angles euclideens (dit d'Euler) _X, _Y et _Z en quaternions, et a l'aide d'une condition au moment de la reconvertion en angles d'euler, on procede sois a un calcul(condition if), sois a l'autre(condition else). tout est expliqué en francais ici http://jeux.developpez.com/faq/math/?page=transformations#Q34

Ils y donnent des examples de code qui font ca, mais une fois en pratique, mon cube ne tourne toujours pas comme mon bras.

Pensez vous que ma premiere fonction est éronnée ? Dans le cas contraire, le probleme doit venir de la deuxieme fonction

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

par Dlzlogic » 20 Juin 2012, 14:40

Désolé, je ne comprend rien.
Une translation est l'opération que permet de transformer un point P(x,y,z) en un point P'(x',y',z') Si le vecteur de translation est t(X,Y,Z), alors
x'=x+X ; y'=y+Y ; z'=z+Z;
Je ne vois pas très bien le rapport avec l'utilisation que vous en faites.
Les quiaternions, j'ai jamais utilisé.
Quand vous parliez de l'épaule et de la main, je pensais que vous sous-entendiez que le coude était entre deux, donc que vous cherchiez à calculer l'angle entre le bras et l'avant bras.
Donc, sans parler de translation, rotation quaternion, cube qui tourne à l'envers, dites plutôt ce que vous cherchez à faire.
On n'en est pas encore au blocage de cardan.

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

par ebkc » 20 Juin 2012, 14:47

Je veux faire une fonction qui retourne les angles de rotations X Y Z pour orienter un point A en direction d'un point B. Et je ne connais que les positions X Y Z de ces deux points.

en oubliant tout le reste, au plus simple, c'est ca l'idée. et il n'y a pas de coude dans l'histoire. Je considere mon bras comme un seul segment. C'est vrai que ce n'est pas tres clair :)

Quel serait donc selon vous les etapes a suivre ?

merci

Dlzlogic a écrit:Désolé, je ne comprend rien.
Une translation est l'opération que permet de transformer un point P(x,y,z) en un point P'(x',y',z') Si le vecteur de translation est t(X,Y,Z), alors
x'=x+X ; y'=y+Y ; z'=z+Z;
Je ne vois pas très bien le rapport avec l'utilisation que vous en faites.
Les quiaternions, j'ai jamais utilisé.
Quand vous parliez de l'épaule et de la main, je pensais que vous sous-entendiez que le coude était entre deux, donc que vous cherchiez à calculer l'angle entre le bras et l'avant bras.
Donc, sans parler de translation, rotation quaternion, cube qui tourne à l'envers, dites plutôt ce que vous cherchez à faire.
On n'en est pas encore au blocage de cardan.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 20 Juin 2012, 15:00

slt,

Quel est le centre des rotations.
Quel est le repere.
la vie est une fête :)

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

par ebkc » 20 Juin 2012, 15:09

fatal_error a écrit:slt,

Quel est le centre des rotations.
Quel est le repere.


hello

le centre de rotation c'est l'epaule,
le repere si tu parles de la cible, c'est la main.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 20 Juin 2012, 15:55

je veux dire un repere cest consistitue d'une origine, et de trois axes.

peux tu donner des vecteurs pour les trois axes du reperes ainsi que les coordonnees de lepaule du coude et de la main exprimes dans ce repere?
la vie est une fête :)

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

par ebkc » 20 Juin 2012, 16:03

Je ne cherche pas a calculer une valeure particuliere mais bien faire une fonction pour traiter en temps reel les infos recu.

Ces infos sont 2 tableaux de positions

epaule{x,y,z}

et

main{x,y,z}

et je n'essaye pas de calculer l'angle du coude et je ne le prends pas en consideration. Le bras est simplement constitué du coude a la main dans ces essais.

Une fois l'algorythme fonctionnel, je l'appliquerais a chaque joints dans le bon ordre. epaule -> coude, coude -> main, hanche -> genou, genou-> pied, ...

fatal_error a écrit:je veux dire un repere cest consistitue d'une origine, et de trois axes.

peux tu donner des vecteurs pour les trois axes du reperes ainsi que les coordonnees de lepaule du coude et de la main exprimes dans ce repere?

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 20 Juin 2012, 16:11

attends, ya un probleme qqpart:
Si tu ne tiens pas compte du coude, mais uniquement de lepaule et de la main...

Tu veux connaitre un angle entre deux points??????
la vie est une fête :)

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

par ebkc » 20 Juin 2012, 16:16

Encore une fois j'ai du manquer de clarté,
mais on va y arriver :)

Je considere le bras tendu perpendiculairement au corp comme rotX = rotY = rotZ = 0°

fatal_error a écrit:attends, ya un probleme qqpart:
Si tu ne tiens pas compte du coude, mais uniquement de lepaule et de la main...

Tu veux connaitre un angle entre deux points??????

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 20 Juin 2012, 18:42

bon, non c'est toujours pas clair.

c'est quoi rotX, la rotation autour de l'axe (Ox)?

tu essaies avec deux points P1 et P2 de trouver les angles rotX, rotY, rotZ tel que
rotationAutourDeZ(rotationAutourDeY(rotationAutourDeX(P1))) = P2 ?
la vie est une fête :)

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

par ebkc » 21 Juin 2012, 10:06

Hello Fatal_error_ !

Merci de ton acharnement a essayer de comprendre, force est de constater qu'il me manque du vocabulaire en math.

C'est pourtant bien simple je crois. En bouliant tout ce qui a été dit.

On repose un problem plus simple, sans main, sans epaule, sans rien d'autre que 2 cubes.

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

et le cube B en position X = 9, y = 12, z = 7;

Les coordonnées du point B sont la a titre d'exemple, l'objectif est de faire une fonction capable d'analyser des donnees en temps reel

en reprenant ma premiere fonction, et l'adaptant a cette situation ca donne :

(j'ai commenté le code pour plus de clareté)

Code: Tout sélectionner
function getAngle(AB,BC) {

AC = sqrt((AB*AB)+(BC*BC));  // Pythagore avec un triangle rectangle imaginé ABC.

BD = AC - AB; // Ajout du point D tel que AD = AB. pour creer un deuxieme triangle rectangle BCD

// Le triangle ADC a donc 2 cotés egaux.

angle = atan(AB/BC)+atan(BD/BC) // Je calcul l'angle BAC et BCD (tan=opp/hyp) et je les additione pour obtenir l'angle ACD.

angle = ( angle *180/PI)*2 // Or il sagit d'un triangle a 2 cotés egaux. donc 180-(2*l'angle ACD) = l'angle DAC.

return angle%360; // modulo 360

}


// Je donne a ma fonction la distance en le cube A et le cube B, de 2 des axes connus.
// qui seront ensuite considéré comme deux cotés d'un triangle
// Comme le cube A est en position 0, la position du cube B correspond donc a la distance.
// Notez qu'une fonction (comme celle du dessus) n'est pas executée avant son appel(3x dans ce cas)

_X = getAngle(9,12); // ici X,Y
_Y = getAngle(9,7); // ici X,Z
_Z = getAngle(12,7); // ici Y,Z


Le troisieme point de mon triangle est donc imaginaire, deduis de simple calcul. Il garde toujours la x = 0 et z = 0, et y = AC.

Ce shema posté plus haut represente bien la chose

Image

Si tu ne comprends vraiment pas, je n'ai plus d'autres mots malheuresement, mais si tu es vers Paris, je peux te montrer en pratique mon probleme :)

bye

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 21 Juin 2012, 11:16

re,

si je regarde ta fonction, je comprends, tu veux langle entre le vecteur AB et le vecteur AC, dont les coordonnees du point C peuvent varier

correct?

edit: non en fait je comprends rien quand je regarde les appels a la fonction.
C'est qd mm dingue qu on puisse pas comprendre ce que tu veux faire...

(ps: ton brouillon est pas lisible)
la vie est une fête :)

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

par ebkc » 21 Juin 2012, 11:30

si, si c'est bien ca !

langle entre le vecteur AB et le vecteur AC, dont les coordonnees du point C peuvent varier !


comme il y a trois angles a calculer en 3D, je fais trois appel a la meme fonction, une fois en lui donnant les coordonnée XY, une fois XZ et une fois YZ.

les valeurs entre parentheses correspondent au dimentions de BC et AC :)

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

par Dlzlogic » 21 Juin 2012, 11:39

Bonjour Fatal_error,
Je crois que j'ai compris.
D'une part il y a un individu qui se déplace devant une caméra. Les points caractéristiques sont munis d'un truc qui fait que le résultat de la photo sera un nombre limité de points connus dans le plan de la prise de vue.
D'autre-part, il y a un modèle dont l'apparence est très différente du personnage qu'on a photographié et qu'on voudrait se faire déplacer. Ce serait par exemple assez intéressant de voir je ne sais quel personnage connu grimper à une échelle de pompier.

Si mon hypothèse est bonne, c'est un peu ça que j'essaye de faire dire à ebkc depuis le début.

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

par ebkc » 21 Juin 2012, 11:56

et je crois que c'est ce que j'essaye de dire :) on va s'entendre :)

Dlzlogic m'a dit de poser mon probleme, et c'est vrai que j'ai pas du expliquer les bonnes etapes.

Mais oui,

faits :

- il y a une camera un peu special, branchée a un ordi, et quelqu'un bouge devant la camera

- 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

presque exactement comme ca

Image

- 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.

Pour etablir l'algo j'ai decidé de prendre mon bras comme vecteur et commencé et c'est assez dur de taper au clavier et en meme temps se tenir le bras tendu devant une camera, et en meme temps d'essayer de lire les chiffres qui bougent dans les ptites boites. :)

les calculs j'ai essayé de les expliquer au dessus.

D'abord cette histoire de calcul l'angle antre le vecteur AC et AB.

et apres il y a un phenomene dans la rotation en 3D(le blocage de cadran) qui provoque des comportements erratiques. du coup j'essaye de le corriger.

une fois tout ecrit et en place comme je le pensais bon de faire, ca ne marche pas. :mur:

Dlzlogic a écrit:Bonjour Fatal_error,
Je crois que j'ai compris.
D'une part il y a un individu qui se déplace devant une caméra. Les points caractéristiques sont munis d'un truc qui fait que le résultat de la photo sera un nombre limité de points connus dans le plan de la prise de vue.
D'autre-part, il y a un modèle dont l'apparence est très différente du personnage qu'on a photographié et qu'on voudrait se faire déplacer. Ce serait par exemple assez intéressant de voir je ne sais quel personnage connu grimper à une échelle de pompier.

Si mon hypothèse est bonne, c'est un peu ça que j'essaye de faire dire à ebkc depuis le début.

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

par Dlzlogic » 21 Juin 2012, 12:24

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.

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

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

cron

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