[RESOLU][DB-AL] Rotation d'un objet (yaw pitch roll)

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

[RESOLU][DB-AL] Rotation d'un objet (yaw pitch roll)

Message par Fasol0 » 05 Jan 2017 12:57

Bonjour à tous,

Je retourne sur Unity après de longs mois d'arrêts et je suis un peu rouillé..
Je suis confronté à un problème que je pense tout simple mais impossible de m'en sortir:

J'ai un modèle 3D de bateau basique, immobile en translation, je reçoit les données d'orientation d'un capteur inertiel (roulis, tangage, lacet), et aimerais les appliquer à mon bateau.

Je cherche donc à synchroniser l'orientation de mon bateau avec celle de mon capteur inertiel.
mais quoi que je fasse (les données en provenance du capteur sont correctes) la rotation n'est pas bonne, elle semble suivre les axes du repère absolu et non local, malgré qu'un GameObject vide soit parent de mon bateau, et varie parfois brusquement..
J'utilise le code suivant:

Code : Tout sélectionner

bateau.transform.localEulerAngles = new Vector3(roulis, tangage, lacet);
Toute aide est la bienvenue! :)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Rotation d'un objet

Message par boubouk50 » 05 Jan 2017 13:00

Quelles sont les données dans roulis, tangage et lacet? Sont-ce des angles en degrés? radians? des deltas d'angles?
Tu peux t'inspirer des avions avec les termes yawl pitch roll sur le net.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

Re: [DB-AL] Rotation d'un objet

Message par Fasol0 » 05 Jan 2017 16:39

Merci de ta réponse,

Les données en provenance du capteur sont les angles absolus (pas des variations d'angles donc difficile d'utiliser la fonction Rotate) en degrés.

J'ai tout de même essayé de passer par les quaternions et la fonction Rotate comme suggéré ici:
http://answers.unity3d.com/questions/12 ... ntati.html

Code : Tout sélectionner

bodyQuat = Quaternion.Euler(données du capteur en degrés);
diffQuat = Quaternion.Inverse(bodyQuat)*lastQuat;
bateau.transform.Rotate(diffQuat.eulerAngles, Space.Self); //Space.World donne les mêmes résultats...
lastQuat = bodyQuat;
Mais ma rotation s'effectue encore et toujours suivant les axes absolus..

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Rotation d'un objet

Message par boubouk50 » 05 Jan 2017 16:46

Si ton gameObject ne possède pas de parents qui ont des rotations, alors cela est normal. Le repère Local est inchangé donc est le repère World.
La question est donc: Est-ce que tes angles (roulis, tangage, lacet) correspondent bien aux axes de ton gameObject? (Unity utilise un système de coordonnée Left-Handed Y-up)
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

Re: [DB-AL] Rotation d'un objet

Message par Fasol0 » 05 Jan 2017 17:28

En effet, les angles de mon bateau affichés dans l'inspector ne correspondent pas à ceux envoyés par mon capteur.
Mon bateau est contenu dans un gameObject parent qui a une position angulaire constante de (0,90,0).

Comment puis-je procéder pour effectuer les rotations suivant le repère local du bateau?

Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

Re: [DB-AL] Rotation d'un objet

Message par Fasol0 » 05 Jan 2017 17:32

Mes angles sont en revanche correctes dans le repère World (l'axe du cap bien vertical, roulis axe de devant, et tangage axe latéral)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Rotation d'un objet

Message par boubouk50 » 05 Jan 2017 17:40

Dans ce cas, si un parent a une rotation, le repère local est différent du repère monde.

De ce que je dis, il se peux que le roulis ne corresponde pas à l'axe X, le tangage à l'axe Y et le lacet à l'axe Z. (localement)
Il faut donc redistribuer les axes correctement.
Suivant ce schéma par exemple:
Image
Dans Unity, l'axe Y est l'axe top, représenté par ici. Il faudrait donc permuter Y et Z.
Ensuite, sur l'image le système de coordonnée est en Right Handed Z Up, il faut donc inverser un des axes (généralement Z). Je n'ai pas l'info de la procédure mais il me semble qu'il vaut mieux passer par une matrice de transformation.

Question: ta variable bateau contient bien le bateau et pas son parent?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

Re: [DB-AL] Rotation d'un objet

Message par Fasol0 » 05 Jan 2017 18:23

J'ai bien compris ce point et ai fait les modifications nécessaires pour que les données correspondent,

mais même dans le cas contraire, je ne devrait en aucun cas constater de couplage de rotation, ce qui est mon cas:
par exemple, une rotation suivant un seul axe de mon capteur entraîne une rotation suivant deux axes de mon modèle de bateau,

ou encore un angle donné par mon capteur devrait être égal à un angle de mon bateau (même si ce n'est pas le bon) mais ce n'est pas le cas..

ce qui à mon sens est toujours dû à la prise en compte du repère World et non local :(

Pour résumer le problème:
- Un GameObject de rotation (0,90,0) est parent de mon bateau
- Le script est placé sur le bateau
- J'applique le code suivant:

Code : Tout sélectionner

this.transform.localEulerAngles = new Vector3(roulis, -cap, tang); 
ou un autre utilisant les quaternions.
- Dans tous les cas la rotation du bateau ne respecte pas les valeurs des angles du capteur (même dans le désordre)
car semble (sur ce point je ne suis pas certain) toujours prendre le repère World.

une idée? :(

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Rotation d'un objet

Message par boubouk50 » 05 Jan 2017 18:33

Il y a une hiérarchie des transformations, et parfois faire une rotation sur un axe local est en fait une rotation sur plusieurs axes. Tu n'auras pas les mêmes valeurs que l'entrée si cette hiérarchie est différente en entrée.
Ce que tu peux faire c'est séparer les axes pour mieux le voir.
Tu fais une hiérarchie par exemple:
- Parent
-- AxeRoulis
--- AxeTangage
---- AxeLacet
----- Bateau
Et ton script envoie la rotation du roulis à AxeRoulis, du tangage à AxeTangage et du lacet à AxeLacet.
Amuse-toi à changer la hiérarchie en appliquant le tangage avant le roulis par exemple. Je suis sûr que tu n'obtiendras pas les mêmes résultats.
C'est pour cela qu'il faut bien faire la conversion de système entre l'entrée et la sortie.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

Re: [DB-AL] Rotation d'un objet

Message par Fasol0 » 05 Jan 2017 18:42

Merci! je ne savais pas ça!

je vais essayer

Répondre

Revenir vers « (C#) CSharp »