08-10-2007 11:19:26
- wetneb
- Membres

- Date d'inscription:
- Messages: 29
- IP: 90.26.214.197
- Courriel Site web
Bonjour,
Je cherche à replacer le point d'origine d'un objet 3D en utilisant Irrlicht. Les objets que je manipule sont des pavés (géométriquement parlant, hein!). J'ai deux scene node : un IAnimatedSceneNode parenté à un ISceneNode. Le IAnimatedSceneNode représente l'objet 3D. Je cherche donc à ce que le coin du pavé en bas à gauche (Y+ est le haut) corresponde au point 0, 0, 0 du scene node générique (IScenNode, le parent). Pour cela, j'ai joué sur la position du IAnimatedSceneNode, en récupérant les dimensions du pavé.
J'ai fait comme ça :
// mAnimatedNode est l'enfant, celui qui représente l'objet 3D
core::vector3df deplacement = mAnimatedNode->getTransformedBoundingBox().MinEdge;
core::vector3df box = mAnimatedNode->getTransformedBoundingBox().getExtent();
deplacement.invert();
deplacement.X -= box.X;
deplacement.Z -= box.Z;
deplacement *= mEchelle;
mAnimatedNode->setPosition(deplacement);Mais ça ne semble pas fonctionner avec tous les objets 3D.
Y aurait-il une méthode interne au moteur pour faire ça ? Ou sinon comment faire ?
Merci !
Hors ligne
08-10-2007 13:27:52
- firnafin
- Membres

- Date d'inscription:
- Messages: 150
- IP: 195.83.163.5
- Courriel
deplacement=mAnimatedNode->getTransformedBoundingBox().MinEdge ( coords global )
mAnimatedNode->setPosition(deplacement) ( coords relavite : coords parent
Edit :
Pas super comme reponse : )
Je n'avais pas le temps de faire mieu.
A vrai dire je ne comprends pas bien ton code ( a moins que je ne "captes" pas bien le probleme aussi) , j'essayerai comme ca:
irr::core::aabox3df<irr::f32> box=mAnimatedNode->getBoundingBox();
box=mAnimatedNode->getTransformation().transformBox(box); //( en coords parent : la "node generique" )
mAnimatedNode->setPosition(mAnimatedNode->getPosition()-box.MinEdge);Comme ca le MinEdge est a l'origine du node parent , en 0,0,0 ( coords parent ).
Hors ligne
09-10-2007 15:04:34
- wetneb
- Membres

- Date d'inscription:
- Messages: 29
- IP: 90.26.214.197
- Courriel Site web
a moins que je ne "captes" pas bien le probleme aussi
Moi non plus, je ne comprends pas très bien ce que j'ai fait :S ...
La méthode "getTransformation()" n'est apparemment pas présente à l'appel.
C'est probablement "getRelativeTransformation()", donc je l'ai remplacé.
Erreurs du compilo :
/media/sda2/rpg/EditeurBatiment/module.cpp:126: erreur: no match for «operator=" in «box = #«obj_type_ref" not supported by dump_expr#<expression error>().irr::core::CMatrix4<T>::transformBox [with T = float](((irr::core::aabbox3d<float>&)(& box)))"
/usr/local/irrlicht-1.3.1/include/aabbox3d.h:22: note: candidats sont: irr::core::aabbox3d<float>& irr::core::aabbox3d<float>::operator=(const irr::core::aabbox3d<float>&)
Process terminated with status 1 (0 minutes, 11 seconds)
2 errors, 0 warningsHors ligne
09-10-2007 15:28:12
- firnafin
- Membres

- Date d'inscription:
- Messages: 150
- IP: 195.83.163.5
- Courriel
j'ai ecri n'importe quoi j' avais fait ca de tete sans la doc .
Effectivement il s'agit bien de getRelativeTransformation(), pour ce qui est de l'erreur cela vient du fait que transformBox est du type void donc elle modifie directement box ,la ligne devient simplement :
mAnimatedNode->getTransformation().transformBox(box);Teste ,et si ca ne marche pas c'est que je n'ai pas compris le probleme.
Hors ligne
09-10-2007 16:52:32
- wetneb
- Membres

- Date d'inscription:
- Messages: 29
- IP: 90.26.214.197
- Courriel Site web
Apparemment, tu as bien compris le problème, puisque ça fonctionne...
Merci bien !
Hors ligne



