PDA

Voir la version complète : Position et rotation globale en COFFEE



Steph3D ::.
20/12/2003, 04h22
Alors voilà la nouvelle enigme ;-)
je voudrais déplacé un objet en fonction d'un autre en C.O.F.F.E.E. avec le classique code du style


main (Document,op)
{

var Objet = Document->FindObject ( "MonObjet" );
var Cible = Document->FindObject ( "Move" );

var Position = Cible->GetPosition ( );

Objet->SetPosition ( Position );

}

Sauf que je ne voudrai pas qu'il le fasse en tenan compte de sa position sur la liste des objets parents, mais de sa position dans la scene, c'est-à-dire exactement comme la variable Position Globale en XPresso, sauf que là c'est du COFFEE :-)
bref ! en gros, il reste collé à un objet cible externe tout en étant dans une hiérarchie d'objet parent

Bien sûr, je pourai faire des calculs ( vectoriel super complexe, suis fort ;-) ) comme ceci qui marche très bien


main (Document,op)
{

var Objet = Document->FindObject ( "MonObjet" );
var Cible = Document->FindObject ( "Move" );
var pr1 = Document->FindObject ( "Parent1" );
var pr2 = Document->FindObject ( "Parent2" );

var Pos = Cible->GetPosition ( );
var Position1 = pr1->GetPosition ( );
var Position2 = pr2->GetPosition ( );

var Position = Pos-(Position1+Position2);

Objet->SetPosition ( Position );

}

Mais dans mon cas, je ne suis pas toujours sensé savoir à quel niveau de la liste des objets il se trouve, et même si ce serait le cas, si je dois me taper tous les objets, ce n'est pas top !

Tengaal
20/12/2003, 12h09
Le réponse est dans la Matrice....

Non, ce n'est pas une citation de la célèbre trilogie, mais la solution à ton problème ! :wink:
En effet pour connaitre les position/echelle/rotation d'un objet, les fonctions GetPosition()/GetScale()/GetRotation() donnent les coordonnées par rapport à l'axe de l'objet parent.
Maintenant pour avoir des coordonnées par rapport à l'axe du monde, et ce, quelque soit l'emplacement de l'objet dans les hiérarchies du projet il faut passer par la Matrice Globale:
var matrice=objet->GetMg();

Ensuite on peut accéder à la position partir de "matrice": var pos=matrice->GetV0();

Donc, pour l'exemple, on créé un cube dans le quel on place une sphère "enfant" en la décalant du cube dans l'espace, puis on ajoute à celle-ci l'expression COFFEE suivante:


main(doc,op)
{
// position par rapport à l'axe de l'objet parent
println("Position relative :");
println(op->GetPosition());

//position par rapport à l'axe du monde
println("Position dans le monde:");
println(op->GetMg()->GetV0());
}


Enfin, en ouvrant la fenêtre "Console" de C4D, on obtient 2 vecteurs (x, y, z) affichés, qui correspondent à la position de la sphère par rapport au cube, et à la position de la sphère par rapport au monde. :wink:

Pour plus d'info, aller voir dans la doc COFFEE, et chercher "matrix".