Ces paramètres permettent de contrôler la façon dont character studio effectue la transition d'un état à l'autre lors de l'utilisation d'un contrôleur cognitif. Pour plus d'informations, reportez-vous à la rubrique Pour configurer et utiliser un contrôleur cognitif.
L’élément principal de la transition est le script MAXScript (qui contient des instructions conditionnelles). Ce script associé au contrôleur est exécuté une fois par image et peut tester n’importe quel aspect de la scène et effectuer une transition ou non, selon que le test est réussi (vrai/true ou 1) ou est un échec (faux/false ou 0).
Character studio exécute les scripts une fois par image et par représentant attribué, afin que les objets et les effets puissent être animés tout en permettant aux représentants de réagir avec précision.
Tous les scripts utilisés dans les transitions utilisent la structure suivante :
fn [FunctionName] del t = ( [MAXScript code] if [MAXScript conditional] then 1 else 0 )
La ligne d'ouverture contient " fn " (fonction) suivi du nom de la fonction (qui doit figurer également dans la boîte de dialogue de transition d'état), des paramètres d'entrée " del trans t " et des signes " = ( ". Ces signes peuvent être suivi de tout code MAXScript ou de rien.
La ligne de fermeture contient une condition MAXScript requise, puis l'expression " then 1 else 0 " qui signifie : si le résultat de cette condition est " vrai/true ", renvoyer 1 (la transition est exécutée) ; si le résultat de cette condition est " faux/false ", renvoyer 0 (la transition n’est pas exécutée). Si vous le souhaitez, vous pouvez inverser l'ordre des valeurs 1 et 0 (soit : " then 0 else 1 "), auquel cas le résultat sera également inversé (" vrai/true " = pas de transition, " faux/false " = transition). Enfin, la fonction doit se terminer par la parenthèse fermante " ) ".
Vous trouverez ci-dessous quelques exemples de scripts pouvant être utilisés dans les contrôleurs cognitifs, avec quelques brèves explications. Vous pouvez les utiliser dans vos scènes et les modifier.
Cet exemple de script teste le nombre de particules émises par le système de particules Spray01 et indique que la condition est respectée si le nombre est égal à 100.
fn TestParticles del t = ( if (particleCount $Spray01) == 100 then 1 else 0 )
Cet exemple de script teste la position de l'objet Sphere03 et indique que la condition est respectée si les coordonnées de la position sont les suivantes : X>=150, Y>=0, Z>=70.
fn PositionCheck del t = ( if ($sphere03.pos.x >= 150 and $sphere03.pos.y >=0 and $sphere03.pos.z >=70) then 1 else 0 )
Cet exemple de script teste le paramètre Densité d'un effet de brume et indique que la condition est respectée si la valeur est de 50.
fn TestAtmos del t = ( atmos_fog = getAtmospheric 1 print atmos_fog.density -- to:debug if (atmos_fog.density == 50) then 1 else 0 )
La deuxième ligne affecte la brume à une variable appelée " atmos_fog ". Ceci est nécessaire uniquement pour les effets atmosphériques ; avec la plupart des objets standards, vous utilisez le nom de l'objet précédé du symbole $, comme dans les deux exemples précédents. Le " 1 " qui suit la commande getAtmospheric fait référence à la position de l'effet dans la boîte de dialogue Effets de rendu liste Effets.
Lorsque vous avez effectué cette affectation, entrez la commande suivante dans le Récepteur MAXScript pour obtenir une liste des propriétés de l'effet atmosphérique :
ShowProperties atmos_fog
En outre, la troisième ligne de l'exemple de script n’est pas nécessaire pour le contrôleur cognitif ; elle indique simplement le résultat du test dans la fenêtre Récepteur à des fins de débogage.
L’exemple de script suivant utilise la fonction Distance de MAXScript pour obtenir la distance entre un représentant et un objet de scène, et indique que la condition est respectée si la valeur est inférieure à 30.
fn TestDist del t = ( get_dist=distance $sphere01.pos $delegate02.simpos print (get_dist) if get_dist < 30 then 1 else 0 )
Comme dans l'exemple précédent, une variable est utilisée ; cette fois, uniquement pour que le script reste simple. Dans la deuxième ligne, la fonction Distance sert à obtenir la distance entre une sphère et un représentant. Le résultat est affecté à la variable " get_dist ". Pour tester tous les représentants qui utilisent le contrôleur cognitif au lieu d'un seul représentant, vous remplaceriez " $delegate02.simpos " par " del.simpos ".
Dans la troisième ligne du script, la distance calculée est indiquée dans la fenêtre Récepteur à des fins de débogage. Cette ligne n’est pas nécessaire à la simulation et peut être supprimée. Enfin, la valeur est comparée à la constante 30, et si elle est inférieure, le script renvoie 1, indiquant que la transition va être effectuée.
Vous pouvez vous baser sur ce script pour créer un contrôleur cognitif qui utilise plusieurs comportements ou états Rechercher pour déplacer les représentants sur une trajectoire au milieu de nombreux autres objets. Dès que le représentant se trouve à une distance donnée d'un objet spécifique, la transition est effectuée et le représentant passe à l'état Rechercher suivant, se déplaçant ainsi vers l'objet suivant. Comme la transition est testée à chaque image, les objets cibles peuvent se déplacer comme vous le souhaitez et donner une animation d'apparence dynamique.
Cet exemple de script vérifie le paramètre Angle d'un modificateur Courbure appliqué à un cylindre et indique que la condition est respectée si la valeur est comprise entre 70 et –70, bornes incluses.
fn TestBend del t = ( if ($cylinder01.bend.angle <= 70 and $cylinder01.bend.angle >= -70) then 1 else 0 )
L'énoncé If à la deuxième ligne met le texte entre parenthèses car deux conditions testées par le script sont vérifiées : si l'angle est inférieur ou égal à 70 et si l'angle est supérieur ou égal à -70. Comme " et " lie les deux conditions, le script est respecté uniquement si les deux sont vraies.
Vous pouvez déterminer dans un script de transition quel comportement influence actuellement un certain représentant. A cette fin, Crowd propose une méthode utilisant un MAXScript. Vous pouvez même vérifier si un représentant donné est défini comme cible pour ce comportement. Cela pourrait s'utiliser par exemple, dans une scène de cocktail dans laquelle Nathalie évite Pierre si Pierre recherche Christine. Mais, si Pierre évite Christine, alors Nathalie recherchera Pierre.
L'exemple de script suivant utilise un scénario plus complexe que celui décrit dans le paragraphe précédent. Voici une présentation.
Six représentants sont confinés dans une " pièce " définie par quatre grilles, utilisant un comportement Répulsion mur. Au cours de la simulation, les représentants 1, 2, 3 et 5 errent sans but. Cependant, le représentant 4 utilise un contrôleur cognitif (cc1) qui lui indique de commencer à errer, puis de passer à l'un des trois comportements Eviter si des membres de l'une des trois paires de représentants arbitraires s'approche à moins de 50 unités d'une autre paire. Chacun des comportements Eviter vise un groupe différent de trois représentants. Deux de ces groupes comprennent le représentant 2. Au représentant 6 est affecté un deuxième contrôleur cognitif (cc2) qui utilise le script ci-dessous afin de lui indiquer de passer à un comportement Eviter si le représentant 4 évite le représentant 2. La ligne suivante de la fonction transfunc4 constitue le cœur du script :
(isDelAvoid = isDelegateAvoiding the_current_behavior.name "$Delegate04" "$Delegate02"
Chargez le fichier, appuyez sur F11 pour ouvrir la fenêtre Récepteur, puis effectuez la résolution. La fenêtre Récepteur affiche un message à chaque fois que le représentant 4 évite le représentant 2.
Vous pouvez utiliser ce script tel quel dans vos simulations, afin de vérifier si un représentant en évite un second en utilisant les noms des représentants dans la ligne ci-dessus ainsi que les noms de vos comportements Eviter dans la liste de transfunc4, ajoutant ou supprimant autant de lignes que nécessaire.
L’exemple de script illustre un deuxième aspect important : les scripts de transition des contrôleurs cognitifs peuvent contenir plusieurs fonctions. Crowd exécute d'abord la fonction spécifiée dans la boîte de dialogue de transition d'état champ Condition de transition, et cette fonction appelle une ou plusieurs autres fonctions du script, qui peuvent elles aussi à leur tour appeler des fonctions. Dans ce cas, transfunc4 appelle la première fonction, isDelegateAvoiding, lui passant trois paramètres.
Enfin, le script contient une fonction spéciale, getBehaviorType, qui compare un comportement saisi aux comportements connus figurant dans une liste. Lorsqu'il trouve un comportement connu correspondant, il l'envoie. Dans ce cas, transfunc4 parcourt la liste des comportements influençant le représentant 04 et teste chaque comportement avec la fonction getBehaviorType. Si un comportement Eviter est utilisé, la fonction transfunc4 vérifie si le représentant 2 est un obstacle pour ce comportement Eviter. L’utilisation de cette fonction est une méthode plus efficace et plus souple que le test de comportements spécifiques, surtout si votre scène contient de nombreux comportements du même type ou bien encore si vous modifiez constamment les paramètres des comportements. Vous pouvez consulter les comportements que le programme a renvoyés en supprimant les deux tirets au début de la ligne suivante dans transfunc4.
-- format "Return Behavior: %\n" return_behavior fn isDelegateAvoiding theCurrentBehavior theCogDelegate theAvoidingDelegate = ( the_return = 0 counter = 1 for the_assignments in $Crowd01.assignments do ( if the_return == 1 then exit if the_assignments.delegate != undefined then ( if theCogDelegate == "$"+the_assignments.delegate.name then ( if the_assignments.cogcontrol != undefined then ( for the_cogcontrol_state in the_assignments.cogcontrol.states do ( if the_return == 1 then exit for the_cogcontrol_state_behavior in the_cogcontrol_state.behaviors do ( if the_return == 1 then exit if the_cogcontrol_state_behavior.name == theCurrentBehavior then ( for the_obstacle in the_cogcontrol_state_behavior.obstacles do ( if the_return == 1 then exit if "$"+the_obstacle.name == theAvoidingDelegate then ( --format "Set it true here !\n" the_return = 1 ) ) ) ) ) ) ) ) counter = counter + 1 ) the_return ) fn getBehaviorType val = ( if not iskindof val MAXRefTarg do return undefined theBehaviors = #( Speed_Vary_Behavior ,Orientation_Behavior ,Scripted_Behavior , Wander_Behavior ,Surface_Arrive_Behavior ,Path_Follow_Behavior , Seek_Behavior ,Avoid_Behavior ,Wall_Seek_Behavior , Space_Warp_Behavior,Wall_Repel_Behavior,Surface_Follow_Behavior , Repel_Behavior ) val_classID = val.classid for behav in theBehaviors do ( local behav_classid = behav.classid if val_classID[1] == behav_classid[1] and val_classID[2] == behav_classid[2] do ( return behav ) ) undefined ) fn transFunc4 del t = ( another_the_return = 0 counter = 1 for the_current_behavior in $Delegate04.behaviors do ( if another_the_return == 1 then exit return_behavior = getBehaviorType the_current_behavior --format "Return Behavior: %\n" return_behavior if return_behavior == Avoid_Behavior then ( isDelAvoid = isDelegateAvoiding the_current_behavior.name "$Delegate04" "$Delegate02" if isDelAvoid == 1 then ( format "$Delegate04 found to be Avoiding $Delegate02\n" format " Starting Transition in frame %:\n" t another_the_return = 1 ) ) counter = counter + 1 ) another_the_return )
Lorsque plusieurs transitions renvoient une valeur Vraie, character studio utilise le paramètre de priorité pour déterminer laquelle privilégier. Il effectue la transition qui a la valeur de priorité la plus faible. Ainsi, une transition dont la valeur de priorité est de 0 passe devant une transition ayant une valeur de priorité de 1, etc.
Plus la valeur est faible, plus la transition est abrupte ; plus la valeur est élevée, plus la transition est progressive.
Plus la valeur est faible, plus la transition est abrupte ; plus la valeur est élevée, plus la transition est progressive.
Nom de la fonction MAXScript qui indique quand et comment la transition s'effectuera.
Ce nom doit également apparaître au début de la fonction principale du script, à la suite de " fn ". Le script peut contenir d'autres fonctions appelées par la fonction principale ainsi que par les autres fonctions.
Ouvre une fenêtre d'éditeur dans laquelle vous pouvez éditer, enregistrer et charger un script de transition MAXScript.