#0 

02-03-2009 13:30:22

Steph
Membre
Date d'inscription: 02-03-2009
Messages: 15

Hello world smile

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

Code:

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 roll

Pour les positions, c'était beaucoup plus simple, un petit parent->getAbsoluteTransformation().inverseRotateVect( vector ); remettait les positions à leurs bonne places.

Hors ligne


#1 

02-03-2009 15:50:14

Metallizer
Abonné
Lieu: Région Parisienne
Date d'inscription: 07-01-2007
Messages: 100
Site web

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


#2 

02-03-2009 17:01:16

Steph
Membre
Date d'inscription: 02-03-2009
Messages: 15

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

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

Code:

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


#3 

03-03-2009 15:30:07

Steph
Membre
Date d'inscription: 02-03-2009
Messages: 15

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


#4 

03-03-2009 18:06:42

Steph
Membre
Date d'inscription: 02-03-2009
Messages: 15

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 sad C'était un poil plus compliqué qu'une simple soustraction d'axes...

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
Analysé par
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
28 invités en ligne
Aucun membre connecté
RSS Feed