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
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 :-)main (Document,op)
{
var Objet = Document->FindObject ( "MonObjet" );
var Cible = Document->FindObject ( "Move" );
var Position = Cible->GetPosition ( );
Objet->SetPosition ( Position );
}
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
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 !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 );
}
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:
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: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());
}
Pour plus d'info, aller voir dans la doc COFFEE, et chercher "matrix".