 | |  |
| Nicklaus le vrai | Salut a tous bon voilà je suis en train d'essayer de faire un script mais je rencontre une difficulté, je m'explique
j'ai l'habitude dans mes riggs de faire mes contrôleurs dans la viewport ( je viens de 3dsmax a la base)
Là je me suis dis "pourquoi pas me faire une sorte de bouton qui, quand j'appuie dessus, me remet mes sliders à zero, sachant qu'il me faudrait un bouton par slider. A savoir que mon slider n'est qu'un circle parenté a une curve toute droite avec des limit informations sur les axes concernés.
------
Alors voilà j'ai testé un truc pour la fonction align et ça a l'air de marcher.
genre je crée une cube et une sphère et je veux que quand je sélectionne la sphère, le cube ait ses transform en translation qui reviennent à zéro.
ça donne ça :
int $RAZ = `scriptJob -ct "SomethingSelected" "dis"`;
proc dis()
{
string $list[] = `ls -sl`;
if($list[0]=="pSphere1" )
setAttr "pCube1.translateZ" 0;
setAttr "pCube1.translateX" 0;
setAttr "pCube1.translateY" 0;
}
pour cancel le script :
scriptJob -k $RAZ;
jusque là ça marche c'est cool mais bon si je dois à chaque fois renommer le script pour chaque slider c'est galère, j'ai donc décidé d'automatiser un peu.
Du coup je me suis dis "hey je vais faire un truc du genre" :
Je choisi mon contrôleur (donc la partie mobile de mon slider en supposant qu'a sa position zéro ses transform soient tous à zéro, et que tout ait été crée au centre de la grille pour éviter les problemes, c'est mieux bien sur)
je lance mon script et :
il renomme mon slider en "CTRLRAZBASE_1" (puis CTRLRAZBASE_2 pour le second et ainsi de suite)
il me crée mon bouton (ici une sphère)
il renomme mon ce bouton de remise a zéro en en "RAZBUTTON_1" (puis RAZBUTTON_2 pour le second et ainsi de suite)
il aligne puis décale sur le coté puis parente ma sphère au slider pour qu'elle suive le mouvement du slider
et après pour assigner la remise à zéro je galère... disons que ce que j'ai fais en renommage je ne parviens pas à le faire pour mon Scriptjob... J'aimerai que pour chaque couple CTRLRAZBASE_N+1 / RAZBUTTON_N+1 j'ai un Scriptjob $RAZ_N+1 associé qui soit créé.
ainsi j'aurai juste à chaque fois à sélectionner un nouveau contrôleur et lancer mon script pour que ça marche, là je ne trouve pas la soluce comme ça...
Est ce que quelqu'un ici avec un grand cœur pourrait me filer un coup de main?
A savoir qu'a l'avenir j'aimerai ajouter :
- un truc du genre "quand le slider est à zéro la sphère est verte et quand ce n'est pas à zéro la sphère est rouge", ça ne doit pas être bien compliqué
- faire en sorte qu'a sa création la sphère soit non renderable (ça doit être une commande à la con à rajouter au moment ou elle est crée ou alors je ferai une autre curve à la place au pire)
- voir si il n'y a pas moyen de gérer le principe de sélection un peu mieux, ici pour une remise à zéro je suis obliger de tout désélectionner et de clique après sur mon bouton de remise a zero, si j'ai un autre objet sélectionné avant de cliquer sur le bouton ça ne se remet pas a zéro...
_______
Voici le script pour l'instant:
//PARTIE RENOMMAGE DU SLIDER
int $i;
string $rename[] = `ls -sl`;
int $selSize = `size $rename`;
for ($i =0; $i <$selSize ; $i++){
rename ($rename[$i]) ("CTRLRAZBASE_" + ($i +1));
}
//SAUVEGARDER SOUS UNE VARIABLE
string $OBJET1forafter[] = `ls -sl`;
print $OBJET1forafter;
//CRÉATION DU BOUTON
select -cl;
polySphere -ch on -o on ;
//RENOMMAGE DU BOUTON int $i;
string $rename[] = `ls -sl`;
int $selSize = `size $rename`;
for ($i =0; $i <$selSize ; $i++){
rename ($rename[$i]) ("RAZBUTTON_" + ($i +1));
}
//SAUVEGARDER SOUS UNE VARIABLE
string $OBJET2forafter[] = `ls -sl`;
print $OBJET2forafter;
//PLACEMENT DU BOUTON ET PARENTAGE
select -cl ;
select -r $OBJET2forafter ;
select -tgl $OBJET1forafter ;
parent;
ResetTransformations;
parent -w;
move -r -os -wd 0 0 5 ;
FreezeTransformations;
select -cl ;
select -r $OBJET2forafter ;
select -tgl $OBJET1forafter ;
parent;
//ASSIGNATION DES REMISES A ZERO (comment faire pour que cette partie soit incrementale? genre que le premier $RAZ soit $RAZ_1 pour RAZBUTTON_1 et CTRLRAZBASE_1 puis $RAZ_2 pour RAZBUTTON_2 et CTRLRAZBASE_2 et ainsi de suite?
int $RAZ = `scriptJob -ct "SomethingSelected" "dis"`;
proc dis()
{
string $list[] = `ls -sl`;
if($list[0]=="RAZBUTTON_1" )
setAttr "CTRLRAZBASE_1.translateZ" 0;
setAttr "CTRLRAZBASE_1.translateX" 0;
setAttr "CTRLRAZBASE_1.translateY" 0;
}
RENDRE LA SPHÈRE NON RENDERABLE
ASSIGNATION DES COULEURS VERT slider a zéro ROUGE slider pas à zéro
|
eky
| si ! cette fonction : hudSliderButton ou alors....
En plus de le surcharger, tu vas permettre de reseter des données directement dans le viewport...sans sécurité donc. ce qui est vivement déconseillé. Car un utilisateur distrait, non avertis, fatigué aura tot fait de perdre son anim .
Pourquoi ne pas simplement faire une toolbox avec des boutons dedans ??????
il faudra en plus Exécuter un code au démarrage (avec un scriptNode unique qui se lance au debut de chaque scene) pour créer un jobSript qui te permettra de détecter la sélection d'un controlleur qui te permettra de reseter ? et ce pour chaque controlleur. Wow, ca fait beaucoup de controlleur ca ! et de code. je te le deconseil.
Mais c'est faisable ! il faut expérimenté !
En fait tu as n couples d'objet. on va dire A control B par job script.
le plus simple est de faire un scripJob qui test si un objet A parmi les n a été sélectionné.
donc....il faut savoir a l'avance quel son les objets pour scripter a l'avance une fonction switch.
qui, en fonction de la selection va executer une commande. ou pas.
string $B[]=`ls -sl`; /// 10 controls. ceux qu'on a sélectionné plus tôt par un `ls -sl`
string $A[]=`ls -sl`; /// 10 sphères précédemment créées string $this="";
string $exp=""; // ta future fonction sera ecrite dans cette variable et c'est cette fonction que ton job script //va appeler.
$exp="global proc razTestSJ()\n"; // declaration de ta futur fonction switch and raz
$exp=$exp+"{\n";
$exp=$exp+" string $sel[]=`ls -sl`;\n";
$exp=$exp+" switch ($sel[0]){\n"; // le switch qui va tester le premier element selectionné int $i=0;
for ($this in $A) // je parcours mes sphères {
$exp = $exp+" case \""+$this +"\" :\n"; // pourchaque bouton je créé une action s'il a été selectioné.
$exp = $exp+" print (\""+$this+ " is selected\" );\n"; // je print son nom...(tu peu tout aussi bien //reseter le controlleur associé,avec un setAttr($B[$i]+".tx" ) 0;
$exp = $exp+" setAttr (\""+ $B[$i]+ ".tx\" ) 0;\n"; //voila. $exp = $exp+" break;\n"; // je break
}
$exp=$exp+" }\n"; // je ferme le switch
$exp=$exp+"}"; // je ferme la fonction
print $exp; ///ici tu verras la declaration de ta futur fonction
eval ($exp); //ici je compile le code contenu dans $exp. c'est une déclaration maintenant contenu en //mémoire de maya.
scriptJob -ct "SomethingSelected" "global proc razTestSJ()"; //cette fonction serra appelée si l'utilisateur //selectionne quleque chose.
// ca marche.
un probléme...
imagine que tu importe ton personnage dans une scene.
tu as namespace qui va se créer devant pour ton personnage . comment va reagir ta fonction avec des nom modifiés ??? mal.
Entre nous quand je veux reseter un controlleur, je vais dans attributs, et je fais 0.
Pour changer la couleur de tes controlleurs. je ne me rappel plus comment on fait.
mais tu peu coder sur scale...pourquoi pas.
|
Creepy Pahuska Etudiant | Pour changer la couleur des controlleurs :
Override Color
en code ça donne ça :
//active les color overrides
setAttr tonObjet.overrideEnabled 1;
//change la couleur
//$x doit être un nombre entre 0 et 31
int $x;
setAttr tonObjet.overrideColor $x;
---------------
Guillaume FERRACHAT
ESMA Montpellier
|
| |
| | |