PDA

Voir la version complète : Bouger une sélection



César Vonc
09/02/2009, 22h40
Bonsoir,

Je cherche à déplacer une sélection de points à l'aide de la position d'un quelconque objet, mais je reste bloqué.

J'ai bien trouvé ce sujet (http://www.frenchcinema4d.fr/forum/index.php?topic=12371.0), mais il ne propose pas de réelle solution, et date un peu. Y aurait-il du neuf, depuis ?

Sir Gong
10/02/2009, 08h58
Pas sûr d'avoir bien compris le problème...
L'outil "transférer" ne t'aide pas ?

shtl
10/02/2009, 09h06
Hello.
J'ai suivi ton lien, qui m'a amené vers ce que j'aurai pensé être la solution. En tout cas de mon coté je ne vois pas vraiment autre chose :?

Tu peux peut être bidouiller quelque chose , mais ça dépend pas mal de ce que tu veux précisément. Tu peux par exemple linker un os avec une influence sur ta sélection et ton objet de control, qui transmettrai sa position à l'os via Xpresso; par exemple?

xs_yann
10/02/2009, 17h12
Tu dois pouvoir le faire en COFFEE. Tu récupères ta sélection grâce à la classe "PointSelectionTag" puis tu contraints cette sélection à la position de ton objet.

edit : n'oublie pas de multiplier la nouvelle postion de tes points par leur matrice si tu ne veux pas qu'ils se retrouvent tous à la même position. :mrgreen:

xs_yann
10/02/2009, 18h31
En fait c'est plus compliqué que je ne le pensais. Je n'ai pas trouvé d'autre solution que d'utiliser la position précédente du null pour avoir le vecteur du mouvement, voilà ce que ça donne en pas très propre :

http://www.xsyann.com/fc4d/coffee_controller.jpg


var oldPos = 0;
main(doc,op)
{
// Recuperation de l'id des points dans un tableau
var sTag = op->GetFirstTag();
var sel = sTag->GetSelection();
var count = sel->GetCount();
var ptsID = new(array,count);
var i, id = 0;
for(i=0; i<op->GetPointCount(); i++)
{
if(sel->IsSelected(i))
{
ptsID[id] = i;
id++;
}
}
// Linkage à la position du null
var ctrl = doc->FindObject("controller");
var mg = ctrl->GetMg();

for(i=0; i<count; i++)
{
var pos = op->GetPoint(ptsID[i])+mg->GetV0()-oldPos;
op->SetPoint(ptsID[i],pos);

}
oldPos = mg->GetV0();

}

Si tu veux reproduire la scène, attention à l'ordre des tags sur l'objet et au nom du null ("controller") ainsi qu'a sa position de départ (0,0,0).

Tu as le gros du code, après si quelqu'un à un meilleur algo coffee ou une soluce en Xpresso c'est mieux, sinon si tu n'y arrive pas avec ce code ou la technique proposé par SHTL plus haut, je peux essayer de te faire un truc plus propre avec DU et tout. :wink:

xs_yann
11/02/2009, 12h37
Normalement ça fonctionne : http://www.xsyann.com/fc4d/pointController.c4d
Il n'y a plus les contraintes citées dans le post précédent. Les DU sont sur l'expression coffee, il suffit juste de placer le tag sur un objet édité, de glisser son tag de sélection de point dans la link box des DU, de glisser le contrôleur dans la link box des DU et voilà. (En bonus tu peux choisir le facteur de déplacement :wink:).

César Vonc
11/02/2009, 18h16
Ah merci, c'est exactement ce que je cherchais !
Ça a l'air de plutôt bien fonctionner, petit bémol tout de même : les normales n'ont pas l'air de suivre le mouvement.
Dommage aussi que tu aies tout mis en anglais.


J'avais, en attendant, rusé en attribuant les coordonnées des points d'une Déformation libre (qui était un simple cube à 8 sommets) à celles d'objets neutres (un objet pour chaque sommet, donc), via Xpresso, mais le résultat n'était évidement pas aussi précis qu'une réelle sélection de points.

Mon but ici était d'animer le levier de frein d'une moto : les points à l'extrémité du fil de fer devaient se déplacer en fonction de la rotation du levier de frein.

shtl
11/02/2009, 18h26
Mmmmhhh....

Pourquoi ne pas avoir utilisé un sweep nurb avec le(s) point (s) d'extrémité de la spline relié au levier par xpresso?

Oune ptite image siouplé?

César Vonc
11/02/2009, 19h28
Excuse-moi, mais j'ai le logiciel en français, qu'entends-tu par sweep nurbs ?

Voici l'illustration :
http://xt.serv2.free.fr/def/levier.swf

L'extrêmité dont je parle est l'ensemble des points à droite, sur le fil.