#0 

08-10-2007 13:19:26

wetneb
Membre
Date d'inscription: 15-04-2007
Messages: 29
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 :

Code:

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


#1 

08-10-2007 15:27:52

firnafin
Abonné
Date d'inscription: 31-03-2007
Messages: 150

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:

Code:

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

Dernière modification par firnafin (08-10-2007 21:11:11)

Hors ligne


#2 

09-10-2007 17:04:34

wetneb
Membre
Date d'inscription: 15-04-2007
Messages: 29
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 :

Code:

/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 warnings

Hors ligne


#3 

09-10-2007 17:28:12

firnafin
Abonné
Date d'inscription: 31-03-2007
Messages: 150

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 :

Code:

mAnimatedNode->getTransformation().transformBox(box);

Teste ,et si ca ne marche pas c'est que je n'ai pas compris le probleme.

Hors ligne


#4 

09-10-2007 18:52:32

wetneb
Membre
Date d'inscription: 15-04-2007
Messages: 29
Site web

Apparemment, tu as bien compris le problème, puisque ça fonctionne...

Merci bien !

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
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
78 invités en ligne
Aucun membre connecté
RSS Feed