| nobrainnobrain pilier de bar de 3dvf
| Alors je suis pas absolument certain d'avoir compris, mais:
à vue de pif, je dirais qu'il faut un script comme ça (je connais pas le scripting sous max, donc je peux te faire qu'un pseudo code)
/!\comme pour tout code, c'est une façon de faire parmi mille autres. C'est tout à fait programmable différemment
variables:
S = la seconde en cours
F[60] = un tableau contenant les 60 fragments de l'aiguille
F = taille des fragments (correspond au nombre de fragments qui constituent une section de l'aiguille)
fps=24
pour S allant de 1 à 60:
F = 60/S; //ici, tu identifie la taille d'une section d'aiguille
pour i allant de 1 à S //i est le numéro de la section que tu traites
RandomPos = (Rand() * 6) % 360 ; //RandomPos contient une valeur d'angle arbitraire. Tu peux paramétrer sa valeur maximum en fonction du temps mais on verra ça plus tard si tu veux
pour j allant de F*(i-1) à F*i //boucle pour traiter les fragments section par section
F[J].setKey(fps*S,RandomPos);//tu définis pour chaque fragment concerné sa position à la fin de la seconde S
fin pour
fin pour
fin pour
un script comme ça, tu le lances une fois pour paramétrer ta scène, et t'as plus qu'à lire l'animation.
par contre 2 choses:
-je te suggère vivement de mettre l'interpolation des valeurs en linéaire. Sinon ce sera illisible (je trouve que ça l'est sur ta vidéo)
-par souci de lisibilité, il serait surement judicieux de respecter un petit temps de pose à chaque seconde, parce que si ça bouge tout le temps, on y comprends que dalle. Pour faire ça, il suffit d'ajouter un deuxième F[J].setKey(fps*S + 5,RandomPos); dans ta boucle
si d'aventure ton soft ne permet pas de définir des keyframe en script (ce serait quand même une grosse blague sous max, mais bon), ou si pour une raison ou pour une autre tu préfères que le script soit plutot réévalué à chaque frame, ça sera un poil plus compliqué: il faudra remplacer le setKey par un bout de code qui fait lui même l'animation de rotation. Sachant qu'il vaut mieux un mouvement linéaire, ça consisterait par exemple à ajouter un nouveau tableau qui contiendrait pour chaque fragment la valeur du step nécessaire d'une frame à l'autre (ce step devant évidemment être recalculé à chaque nouvelle seconde), et ajouter ce step à la valeur de rotation courante. Mais je m'égare... Ya peu de chances que t'aies besoin d'en arriver là. En jetant un oeil dans la doc de max, tu devrais pouvoir rédiger le script correspondant à cet algo.
J'espère que ça t'a éclairé Message édité par nobrainnobrain le 30-12-2011 à 22:05:44
|
xdly3s |
Wouaw, un grand merci à toi nobrainnobrain ! Je dois avouer que pour simplement comprendre la logique du script je m'y suis remis à plusieurs fois. Toi en revanche tu as parfaitement compris le principe du fonctionnement de l'horloge. D'ailleurs tu as raison au sujet du temps de pose, je ne voulais pas que le mouvement soit linéaire, je voulais créer cette pose présente dans toutes les horloges mécaniques, "ajouter un deuxième F[J].setKey(fps*S + 5,RandomPos);" ne me parle pas trop. Je pourrais éventuellement contourner ça en faisant un rendu à 60 fps ( octane rend vite, je peux me permettre ) , puis en re-timant en post prod... je sais c'est triste mais c'est les moyens du bord. Puis ça me permettra de trouver le jute milieu entre l'idée de saccades d'une montre et le fait de garder la fluidité du mouvement qui permet d'en comprendre le principe. J'avais calculé qu'en général le temps de déplacement de l'aiguille dure 3 frame max ( trop rapide pour comprendre le principe) mais je t'accorde que c'est trop lent dans ma vidéo.
Aussi, je ne comprends pas ce dont quoi tu parles lorsque tu dis "je te suggère vivement de mettre l'interpolation des valeurs en linéaire." ? ( ça à probablement à voir avec le fait que je ne script pas ? )
Je vais essayer de soumettre ça à un "savant" qui sache scripter sous 3DS, je pars vraiment de 0, j'ai trouvé très peu de doc qui introduise au max scrpit sur le net du coup je suis preneur ! Je m'y mets en partant de là : http://g.gesquiere.free.fr/Enseign [...] cin_05.pdf "Tu peux paramétrer sa valeur maximum en fonction du temps mais on verra ça plus tard si tu veux"
-> en effet limiter le random d'angle à un intervalle angulaire en fonction de S m’intéresserait, ça consisterait en l'ajout de quoi ? En tous cas je te remercie infiniment pour m'avoir tant aidé sur ce projet, c'est trés généreux de ta part et ça me permet d'amorcer l'année 2012 sur que du bon ! & c'est le propos , me sauve beaucoup de temps ! Meilleurs Voeux & à bientôt ! |
nobrainnobrain pilier de bar de 3dvf
| content d'avoir pu t'aider
d'ailleurs, en relisant mon code, je m'aperçois d'un bug: rien ne permet de contrôler que deux sections consécutives ne sont pas assignées au même angle. Il faudrait approfondir le truc
je te met une nouvelle version qui corrige ça
je reformule donc le script global:
variables:
S = la seconde en cours
F[60] = un tableau contenant les 60 fragments de l'aiguille
F = taille des fragments (correspond au nombre de fragments qui constituent une section de l'aiguille)
fps=24
RandomPos = 0;
Temp=0;
pour S allant de 1 à 60:
F = 60/S; //ici, tu identifie la taille d'une section d'aiguille
pour i allant de 1 à S //i est le numéro de la section que tu traites
while (Temp==RandomPos)Temp = (Rand() % positionMax) * 6 ; //ici, tu trouves une valeur arbitraire comprise entre 0 et positionMax, que tu multiplies par 6 (pour la convertir en degrés). Pour faire varier la fourchette des angles, il suffit de faire varier positionMax. par exemple dans ta vidéo, la positionMax doit être d'environ 10. Si tu la met à 60, tous les angles seront potentiellement valides RandomPos=Temp; //On vérifie que la valeur arbitraire qu'on a dans Temp est différente de l'angle qu'on a assigné au fragment précédent. Si c'est bien le cas, on la valide
pour j allant de F*(i-1) à F*i //boucle pour traiter les fragments section par section
F[J].setKey(fps*S,RandomPos);//tu définis pour chaque fragment concerné sa position à la fin de la seconde S
F[J].setKey(fps*S + 10,RandomPos); // ça, ça consiste à définir exactement la même position pour ton fragment, 10 frames plus tard. Comme ça ton fragment marquera une pose pendant 10 frames (le mouvement sera donc fait sur 14 frames
fin pour
fin pour
fin pour |
nobrainnobrain pilier de bar de 3dvf
| ah oui, et je reviens aussi sur la question de l'interpolation:
par défaut dans ton animation, entre 2 clés, le mouvement subit une interpolation douce.
concrètement, ça veut dire que si tu fais une balle qui a une clé à gauche à la frame 0, puis va à droite à la frame 10, puis retourne à gauche pour la frame 20, le "demi tour" ne sera pas brusque: la vitesse de l'objet s'adaptera au mouvement. En l'occurence, elle ralentira en s'approchant de la frame 10, et réaccélérera ensuite.
c'est très bien quand tu fais une animation organique, mais sur des pièces mécaniques comme une horloge, ça colle pas. Tu dois t'assurer que quand un fragment est en mouvement, sa vitesse sera constante entre deux keyframes
et pour faire ça, il faut que tu paramètre l'interpolation de mouvement pour la rendre linéaire (=vitesse constante et trajectoire droite)
là encore, il faudrait qu'un maxeux passe par là pour te dire comment le faire dans ce soft |
xdly3s | Encore plus génial, de nouveau merci. J'ai passé une semaine assez infructueuse à écumer l'école de potentiel scripteur max, rien trouvé même parmi les profs de 3D ! Du coup & avec ton accord j'aimerais poster le script sur la section "script" de 3DVF. La question que je me pose c'est est-ce qu'il s'agit d'un script ou de ce qu'on appel une "automated animation" ? D'ailleurs je vais aussi le poster sur des forums anglophone pour élargir le champ des possibles ! Si tu as une idée du genre "passer sur maya" ou une idée de forum de "scripteux", je suis volontiers preneur, cette vidéo me fait gentiment paniquer !
Merci encore ! Je te tiens au courant de la suite, et je prie pour qu'il y en ait une
|
nobrainnobrain pilier de bar de 3dvf
| mon accord? houla, pas de ça entre nous, tu peux poster ça où tu veux j'ai aucun problème avec ça
sinon pour le reste, j'ai pas forcément d'idée plus pertinente que "passe sous maya et envoie moi ta scene, que je te fasse ça". Mais ça va beaucoup dépendre de ta deadline: Je suis overbooké en ce moment, et j'aurais probablement pas le temps d'y toucher avant 2 semaines.
Mais d'une manière générale, tu auras sûrement plus de facilité à trouver un scripteur maya que max |
| |