SPLINES et déplacement des ennemis

Le shmup Creator permet à l’utilisateur d’utiliser des courbes pour déplacer les ennemis de manière précise et prévisible : les splines.
Les splines, c’est chouette : l’utilisateur peut créer quelques points, les déplacer, et jouer avec des courbes trés rapidement et visuellement. Il y a beaucoup de tutoriels et d’articles sur le sujet, ce qui est bien, vu que les maths de ces courbes sont largement au dessus de mon niveau !

Mais je vais parler ici des quelques problèmes que nous avons rencontré quand nous avons implémenté le systeme de spline, et les solutions que nous avons trouvées.

. Quel type de spline ?

Il existe des tonnes d’algorithmes de splines. L’algorithme le plus simple à utiliser, à mon avis, est la spline de Catmull-Rom. Avec quelques paramètres seulement on peut créer de jolies courbes. C’est facile de modifier la tension de la spline (qui est à 0.5 par defaut) pour créer des lignes droites, ou des chemins plus ou moins courbes.
Quelque chose que j’aime beaucoup dans la manière qu’a After effects de gérer leur splines, c’est la possibilité de modifier la tension au niveau d’un point, et pas pour toute la spline globalement. J’ai cherché longtemps un algoritm qui me permette de faire ça, et ce n’était pas facile. Un jour, j’ai lu un bon article sur la manière de calculer une spline canonique (ou cardinale), et c’était exactement ce dont j’avais besoin : http://www.charlespetzold.com/blog/2009/01/canonical-splines-in-wpf-and-silverlight.html

. Tension reglable par point

Chaque point peut avoir une position et une tension, et de ce fait c’est vraiment facile de controller l’apparence de la courbe et le chemin de l’enemie. Pour faciliter l’utilisation, je force une tension de 0 (droit) pour le premier et le dernier point de la courbe, ce qui evite des petites bosses lors du départ et de l’arrivée de l’enemie. On peut aussi choisir de fermer la spline et de boucler l’animation.

BuloStudio_20140824_loop

Quand nous avons essayé de déplacer un ennemi sur la spline, nous avons vite découvert qu’il ne se déplaçait pas avec une vitesse constante. L’ennemi ralentissait et accelerait suivant la forme de la courbe. Et nous ne pouvions pas du tout contrôler la vitesse (comme par exemple avoir un ennemi qui se déplace à 5 metres seconde) parce que cette vitesse etait dépendante de la courbe.

Damned!

. Vitesse constante sur une spline

La solution à ce probleme est appelée arc-length re-parameterization. Derrière ce nom barbare se cache une maniere de stocquer dans un tableau les vraies distances de la courbe et de les utiliser quand nous interpolons celle-ci.
Je ne vais pas expliquer en détail comment cela fonctionne, pas parce que je suis feignant (quoique…), mais parceque Motorherp à écrit un excellent article sur le sujet sur le forum de Shmup-dev : http://cokane.com/shmupdevarchive/index.php?action=printpage;topic=1638.0
C’est vraiment un trés bon article, détaillé et bien écrit, et donc j’encourage tous les gens interessés par le sujet à le lire.

Ce qui donne pour résultat, que nous pouvons maintenant : contrôler complètement la forme de la spline, la vitesse de l’ennemi.
Nous avons cependant ajouter d’autres paramètres afin de stopper l’ennemi pendant quelques instans quand il arrive à un certain point, de lui faire effectuer une rotation, de l’orienter de differentes manières…

Tout cela est facile et amusant à utiliser et vraiment graphique, ce qui est l’idée principale de notre outil.

  BuloStudio_20140824_enemies

No Comments