Flower Power Demo

C’est un peu long à expliquer pourquoi, mais Thierry a suggéré de faire pousser des tulipes avec Hyperion… Je me suis attaqué à une petite démo en partant du code sample 84 qui fait bouger de l’herbe avec un shader GLSL, le but étant de faire balancer les tulipes dans le vent virtuel aussi plus tard.

Voilà où ça en est pour l’instant:

L’idée de base pour faire pousser une fleur est de manipuler l’échelle d’un modèle 3D de la tulipe en temps réel. Dans une première phase on fait pousser la fleur en hauteur avec

HYP_Object.SetScale(tulip,h/3,h,h/3)

puis on fait éclore la tulipe en agissant sur les facteurs d’échelle x et z. Le paragraphe suivant présente une manière élégante de faire ceci tout en traitant le cas de nombreuses fleurs.

En effet, la difficulté essentielle consiste à faire pousser les fleurs « presque » en même temps, « presque » à la même vitesse, « presque » à la même hauteur et « presque » verticalement, puis à les faire « presque » éclore en même temps.

Pour faire ceci, j’ai développé une petite librairie d’animation en LUA dont je suis très fier, car elle permet de faire de très nombreuses autres choses, pour ne pas dire tout ! (et encore, je suis modeste…)

Animate

Je décrirai le fonctionnement interne d’Animate dans un autre article. Pour l’instant il vous suffit de connaitre les entêtes de ses deux fonctions essentielles :

function animate(time)

à appeler une fois à chaque frame, exécute toutes les animations définies avec autant d’appels que l’on veut à

function anim_add(obj,func,startp,endp,duration,start,endfunc)

laquelle ajoute une animation à réaliser ainsi :

  • à partir du moment « start », ou immédiatement si ignoré
  • et pendant la durée « duration »
  • à chaque appel de « animate(time) », la fonction func(objet,p1,p2, …) sera appelée, où p1, p2, … sont les paramètre interpolés entre startp et endp
  • et si une « endfunc » est définie, endfunc(anim) sera appelée, où anim est une table contenant tous les paramètres de l’animation qui vient de s’achever.

ça a l’air sport ? Vous allez voir sur l’exemple des tulipes comme c’est simple et génial:

le code qui initialise chaque fleur à partir d’un modèle de base est :

tulip0=HYP_Object.GetIdFromName("tulip")
HYP_Object.SetScale(tulip0,0,0,0)
HYP_Model.SetCloningMode(tulip0,2)

function grow()
    local tulip = HYP_Object.Clone(tulip0)
    HYP_Object.SetPosition(tulip, rnd(-500, 500), 20, rnd(-500, 500) )
    HYP_Object.SetYaw(tulip, rnd(0,360))
    HYP_Object.SetRoll(tulip, rnd(-5., 5.) )
    HYP_Object.SetPitch(tulip, rnd(-5., 5.) )
    local h=rnd(5,8)
    local now=HYP_GetElapsedTimeSeconds()
    anim_add(tulip,HYP_Object.SetScale,{0,0,0},{h/3,h,h/3},rnd(3,7),rnd(now,now+2),eclosion)
end

la dernière ligne de grow() montre comment la pousse de chaque fleur est initialisée :

  • start= rnd(now,now+2) — commencer entre maintenant et dans 2 secondes
  • duration = rnd(3,7) — la pousse dure de 3 à 7 secondes (wow!)
  • à chaque frame, la fonction HYP_Object.SetScale(tulip,p1,p2,p3) sera appelée, où:
    • p2 varie entre 0 et h
    • p1 et p3 varient progressivement entre 0 et h/3
  • quand c’est fini, la fonction eclosion(a) sera appelée, à savoir :
function eclosion(a)
    local p=a["endp"]
    anim_add(a["obj"],HYP_Object.SetScale,p,{p[2],p[2],p[2]},1,rnd(7,9))
end

comme les paramètres de anim_add sont regroupés dans la table a passée en paramètre à éclosion, on peut récupérer dans p l’échelle de la fleur à la fin de sa croissance et créer une nouvelle animation pour la faire éclore:

  • start= rnd(10,12) — commencer la floraison entre 10 et 12 secondes après le début de l’animation (une fois qu’elles ont toutes poussé)
  • duration =1 — la fleur s’ouvre en 1 seconde chrono
  • interpoler l’échelle entre sa valeur actuelle et {p[2],p[2],p[2]}

Comme vous le voyez maintenant, Animate est extrêmement puissant car il permet

  • d’appeler n’importe quelle fonction LUA de l’API Hyperion, ou des fonctions maison, dont le premier paramètre est fixe et les suivants interpolés
  • de définir beaucoup d’animations en parallèle
  • de définir aussi des séquences d’animations
  • et le tout de manière dynamique puisqu’on peut ajouter des animations pendant l’exécution

ToDo

Animate est encore en développement, je vais entre autre y ajouter la possibilité de faire des interpolations non-linéaires, mais si vous avez des question, remarques ou suggestions n’hésitez pas à les poser.

Si vous avez des idées pour que la démo « flower power » soit plus jolie, je les achète avec plaisir. Idéalement j’aimerais :

  • trouver un plus joli décor « environment box », genre « Tele Tubbies » par exemple 😉
  • comprendre pourquoi les fleurs sont blanches quand elles poussent (JegX ?) et les faire vert pâle (avec Animate, of course !)
  • un plus joli éclairage, qui ait l’air de venir du Soleil
  • faire bouger le Soleil !
  • faire onduler les tulipes dans une douce brise. ça je m’en occupe.
Publicités

No comments yet

Laisser un commentaire

Choisissez une méthode de connexion pour poster votre commentaire:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :