Pages: 1
Hello world
Avant de pouvoir faire joujou avec Irrlicht, j'essaye d'avoir un maximum de fonctions de bases pour mouvoir facilement mes objets 3D...
sauf que la je cale pour envoyer une rotation absolue à des objets enfants.
J'ai essayé un truc comme cela...
void setAbsoluteRotation( irr::scene::ISceneNode *objet, core::vector3df vector ) { irr::scene::ISceneNode *parent = objet->getParent(); if (!parent) objet->setRotation(vector); else { irr::core::vector3df rotation( vector - parent->getAbsoluteTransformation().getRotationDegrees() ); objet->setRotation( rotation ); } }
Mais cela marche que si le parent à bouger qu'un axe, après ça devient farfelus... Je peu imaginer physiquement le problème de décalage qui peu avoir, mais mathématiquement j'ai mal au crâne, j'ai tenté des trucs tordus avec les matrices, mais la vaut mieux pas voir mes délires
Pour les positions, c'était beaucoup plus simple, un petit parent->getAbsoluteTransformation().inverseRotateVect( vector ); remettait les positions à leurs bonne places.
Hors ligne
Je vois pas comment faire une rotation absolue... c'est forcément par rapport à quelque chose. Si tu parles de la rotation par rapport aux quatre points cardinaux de ta scène, il suffirait de fixer la rotation de l'objet à 0,0,0 puis d'effectuer la rotation passée en paramètre de la fonction... à voir, je dis peut être une bêtise.
Hors ligne
Ben une rotation global par rapport au world
si tu mets juste tous à zéro, alors il vas prendre l'orientation du parent, tous en ayant ses axes local à zéro, donc pas par rapport au world
Se que je cherche, c'est que si j'envoie un (10,20,5) mon objet devras faire (10,20,5) dans le world, exactement comme un objet->setRotation(valeur);
Sauf que si l'objet à un parent qui à déjà une orientation des axes autre que (0,0,0), alors comme le setRotation et basé sur l'axe local, l'axe vas s'additionner au parent et il ne sera plus orienté par rapport au world. D'où la 1er idée naïve de lui soustraire l'orientation du parent, mais c'est plus compliqué que ça...
Sinon j'ai réussis à faire la position absolue, et la j'ai pas de problème, ça marche bien...
Si quelqu'un en à besoin un jour, voila...
void setAbsolutePosition( irr::scene::ISceneNode *objet, core::vector3df vector ) { irr::scene::ISceneNode *parent = objet->getParent(); if (!parent) objet->setPosition(vector); else { irr::core::vector3df position( vector - parent->getAbsolutePosition() ); objet->getAbsoluteTransformation().inverseRotateVect( position ); objet->setPosition( position ); } objet->updateAbsolutePosition(); }
Avec cette fonction, je donne des valeurs de position absolue par rapport au world, peut importe ou sont placé et orienté les objets parents.
Maintenant il faut que je trouve le même truc pour les rotations, puis le scale pour avoir une trousse complète pour les positionnement dans l'espace 3D.
Hors ligne
Bon je pense avoir trouvé, faut que je calcule la matrice inverse pour revenir à zéro, puis ajouter les coordonnées en local, enfin en théorie... suis une quiche en math, mais je vient de voir dans la doc qu'illricht à quelques belles fonctions toutes cuite dans les matrices ;-)
Hors ligne
Bon, ben ça marche, faut donc d'abords calculer la matrice inverse du parent pour être à zéro selon le world, puis ensuite lui appliquer une rotation matricielle en la multipliant avec une 2e matrice de rotation, en lui donnant le vecteur des axes qu'on veux lui mettre par rapport au world.
2 jours de perdu sur même pas 10 lignes de code C'était un poil plus compliqué qu'une simple soustraction d'axes...
Hors ligne
Pages: 1