Les simulations physiques ont une caractĂ©ristique incroyable: elles peuvent ĂȘtre arrĂȘtĂ©es, rembobinĂ©es et rejouĂ©es. C'est un outil trĂšs puissant qui peut ĂȘtre utilisĂ© pour gĂ©nĂ©rer des mondes inhabituels. Dans cet article, je dĂ©crirai comment j'ai utilisĂ© cela pour synchroniser le son des balles frappant de la musique cĂ©lĂšbre. Je demande Ă ceux qui sont intĂ©ressĂ©s sous la coupe!
introduction
J'adore crĂ©er toutes sortes de visualisations sophistiquĂ©es, de simulations physiques et tout ce genre de choses. Et donc il y a deux ou trois ans, lorsque je dĂ©veloppais ma prochaine idĂ©e , j'avais une idĂ©e, mais que se passerait-il si nous gĂ©nĂ©rions le monde physique pour que les processus qui s'y dĂ©roulent crĂ©ent une mĂ©lodie? En effet, dans une simulation informatique, on peut toujours revenir en arriĂšre, parcourir les options, choisir la meilleure et en mĂȘme temps on a toutes les informations sur la mĂ©lodie: notes, temps de jeu d'une note. J'ai donc eu cette idĂ©e de vivre dans ma tĂȘte jusqu'Ă des temps meilleurs, jusqu'Ă ce que j'aie le temps d'Ă©crire quelque chose en quarantaine, et c'est ainsi que ce projet avec cet article est apparu.
ModĂšle
Pour commencer, j'ai décidé de choisir un modÚle assez simple. Dans mon modÚle, il n'y a que deux types d'objets: des billes et des plates-formes ou des planches. Les plates-formes ont des coordonnées strictement fixes, sont définies par deux points d'extrémité et ont une largeur constante. Les balles tombent sous l'influence de la gravité et peuvent rebondir sur les plates-formes selon les lois de la physique. Aussi, j'ai décidé de n'utiliser que des collisions absolument élastiques pour que l'énergie du systÚme reste toujours inchangée. Mais le plus important est que lorsque la balle et la plate-forme entrent en collision, un son est joué, chaque plate-forme a son propre son et peut se composer de plusieurs notes à la fois.
Ainsi, notre monde se compose de nombreuses plates-formes, dont chacune a un son qui lui est assignĂ©. Et les boules qui tombent dans ce monde peuvent crĂ©er une sĂ©quence de sons, et dans notre cas, mĂȘme une mĂ©lodie.
Algorithme
Nous avons compris le modÚle, mais comment générer un tel monde pour que les sons de coups de balles s'alignent dans une mélodie bien connue ?
J'ai dĂ©cidĂ© d'utiliser le plus maladroit, nĂ©anmoins, qui s'est avĂ©rĂ© ĂȘtre assez bon, la force brute rĂ©cursive, et dans la force brute des gens ordinaires . Mais pour que tout fonctionne comme il se doit, j'ai dĂ» utiliser quelques astuces. Toutes les Ă©tapes suivantes sont effectuĂ©es dans une fonction rĂ©cursive:
- Nous simulons le monde, jusqu'au moment suivant oĂč vous devez jouer une note.
- Si au cours de la simulation il y avait une collision indésirable, nous revenons au niveau supérieur.
- , , , . , .
. «» ( , , ).+ 70 â - 4. .
- 5. ,
- 6. , ,
ticks, aucune collision ne s'est produite, et si tel est le cas, renvoie le monde résultant en conséquence.m
Dans l'image, vous pouvez voir la visualisation d'une Ă©tape de cet algorithme:
Remarque
, , , . , , . , . , .
Récursivité bloquée
Comme tout algorithme bruteforce , celui-ci prĂ©sente un inconvĂ©nient sous la forme de "rĂ©cursivitĂ© bloquĂ©e", cela se produit lorsqu'une "mauvaise" plate-forme ne permet pas de gĂ©nĂ©rer la carte Ă l'avenir, mais en mĂȘme temps vous permet d'en gĂ©nĂ©rer une assez grande partie, mais pas complĂštement ... Dans ce cas, la rĂ©cursion restera bloquĂ©e jusqu'Ă ce qu'elle Ă©numĂšre toutes les options dans le sous-arbre de rĂ©cursivitĂ© que cette «mauvaise» plate-forme gĂ©nĂšre. Il n'y a aucun problĂšme lorsque la hauteur de ce sous-arbre ne dĂ©passe pas 4 Ă 8 niveaux de rĂ©cursivitĂ©, mais parfois elle peut atteindre 20 Ă 30 niveaux, ce qui rend tout simplement impossible d'itĂ©rer Ă travers toutes les variantes de ce sous-arbre.
Par consĂ©quent, dans ma mise en Ćuvre, j'ai dĂ©cidĂ© d'utiliser une heuristique pour surmonter le blocage. L'idĂ©e est de rĂ©duire une partie de la rĂ©cursivitĂ© lorsque de tels cas sont dĂ©tectĂ©s. Il me semblait le plus Ă©vident de revenir
Vous pouvez voir le rĂ©sultat de cette heuristique dans la dĂ©mo, lorsque la progression de la gĂ©nĂ©ration de la carte sera parfois rĂ©initialisĂ©e de 10%. Mais en mĂȘme temps, cela vous permet de terminer la gĂ©nĂ©ration de la carte dans un dĂ©lai raisonnable.
Génération itérative
Nous allons maintenant résoudre le problÚme suivant: aprÚs le début de la génération de la carte, la page se fige pendant 10 à 30 secondes et il est impossible de comprendre ce qui se passe du tout, tout est tombé, ou cela prend juste beaucoup de temps pour générer la carte. Par conséquent, j'ai décidé d'écrire également une implémentation itérative de l'algorithme de génération afin que vous puissiez systématiquement créer une carte en petites portions.
Je n'ai pas eu à inventer quelque chose de nouveau, j'ai juste réécrit l'algorithme récursif sur une pile explicite. Ainsi, une barre de progression est apparue sur la page qui vous aidera à comprendre que le code n'est pas tombé, il faut juste beaucoup de temps pour trouver un emplacement de plateformes adapté à votre piste.
Dans certains cas, la gĂ©nĂ©ration peut prendre trop de temps, pour cela j'ai ajoutĂ© le bouton Play , qui arrĂȘte la gĂ©nĂ©ration et dĂ©marre la simulation du monde.
Télécharger la sonnerie
Pour tĂ©lĂ©charger la mĂ©lodie, j'utilise des fichiers midi, mais avant cela, je l'ai parcourue via tonejs.github.io/Midi pour la transformer en un json convivial pour le navigateur (mais pour le moment, la dĂ©mo n'a pas la fonctionnalitĂ© de tĂ©lĂ©charger mon fichier, seul un choix dans une liste prĂȘte Ă l'emploi est disponible).
Il est également important de noter qu'il y aura souvent plusieurs pistes parallÚles à l'intérieur du fichier midi, mais comme mon algorithme ne fonctionne jusqu'à présent qu'avec une seule boule, une seule piste sera chargée avec le plus grand nombre de notes.
résultats
AprÚs avoir ajouté quelques effets, j'ai enregistré la premiÚre vidéo:
AprĂšs l'avoir revu plusieurs
La vidéo peut montrer une désynchronisation, je l'ai remarqué plus tard. Si vous allez à la page avec la démo , il ne devrait pas y avoir de désynchronisation (le son n'est en fait joué que lorsque le rythme est enregistré).
Et aprĂšs?
J'ai l'intention d'ajouter la possibilitĂ© de gĂ©nĂ©rer de telles cartes pour plusieurs balles Ă la fois. J'ai des idĂ©es sur la façon de faire cela, j'ai testĂ© plusieurs options, mais jusqu'Ă prĂ©sent, elles fonctionnent toutes extrĂȘmement lentement pour gĂ©nĂ©rer une piste complĂšte.
Une autre de mes idĂ©es Ă©tait d'ajouter de nouveaux objets: boutons, tremplins, canons (?), Anneaux ... la liste peut ĂȘtre complĂ©tĂ©e :) Ils peuvent grandement diversifier le monde.
Le code
Tout le code source que vous pouvez trouver dans mon référentiel
Toutes les suggestions, pull requests, quiz sont les bienvenus!