Historique des modifications - Message

Message #8460

Sujet: Problème lors de l'inclinaison d'un mesh suivant le terrain


Type Date Auteur Contenu
Création du message 05-08-2010 22:13:11 firnafin

mr.xyz Ecris:

  • le repère parent standard c'est bien le repère général, celui de la scène? (simple question ^^)

pas toujours, tu peux affilier une node a une autre node ( du coup le parent n'est pas le repère general )

exemple : la tourelle d'un char avec pour parent le char, ainsi setRotation(irr::core::vector3df(0,1,0)) va faire tourner la tourelle comme il faut meme si le char admet lui aussi des rotations dû au terrain par exemple, si la tourelle n'est pas fils de char setRotation(irr::core::vector3df(0,1,0)) va faire n'importe quoi .

le parent par defaut est "root" ( cf irr::scene::scenemanager::getRoot ) qui fournie le repère general.

mr.xyz Ecris:

  • de quelle normale parles tu, celle du terrain ou du mesh ?

celle du terrain.

mr.xyz Ecris:

  • une composante Y de 45 => tu veux dire une rotation de 45 ° pour tourner le personnage ?

oui

mr.xyz Ecris:

  • l'angle souhaité est le vecteur de rotation, avec Y à 0 comme tu disais ?

Je parlais la de l'angle selon l'axe Y, comment la node tourne pour se déplacer.

mr.xyz Ecris:

  • rotateVect est de type void, je pense donc que tu voulais dire de créer un vector (0,1,0) et de le passer en passer en référence ?

Il y a plusieurs rotateVect, a toi de prendre celui qui t'arrange c'est pour ca que j'ai écrie en pseudo code juste pour d'indiquer la fonction à utiliser.

mr.xyz Ecris:

  • ensuite setRotation prends en paramètre un vecteur, donc je ne comprends pas "angle_souhaité*perso_y"

Ici perso_y c'est le vecteur recupéré par rotateVect. De toute maniere je viens de constater que j'ai oublier une etape, pour faire ce que je disais ; il faut passer par les quaternions , le code devient alors :

Code c++ :


vector3df v; //vecteur auxiliaire
quaternion q0,q1;
q0.rotationFromTo(vector3df(0,1,0),n); // n= la normale
q1.fromAngleAxis(Angle_Y_souhaitée*DEGTORAD,vector3df(0,1,0));
q1=q1*q0;
q1.toEuler(v);
node->setRotation(RADTODEG*v);

Sinon tu peux rajouter une composante de rotation selon Y comme tu disais c'est plus simple mais si la normale n'est pas proche de (0,1,0) il va y avoir de drôle de comportement, teste et adopte la méthode qui te convient le mieux.

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
121 invités en ligne
membre en ligne: -
RSS Feed