Skip to content

Latest commit

 

History

History
628 lines (374 loc) · 41 KB

LISEZMOI.md

File metadata and controls

628 lines (374 loc) · 41 KB

Bienvenu au Generative Animated Engine v3.1.1 🐤

[8 minutes de lecture]

Ce dépôt s'appelait jalagar/Generative_Gif_Engine mais maintenant qu'il supporte GIF, MP4, il a été renommé jalagar/animated-art-engine. v3.1.1 est le début de l'ère de l'animation.

Allez voir -pour les anglophones- Youtube Tutorial ou Tutoriel Youtube pour les francophones!

Cette application python et node génère des gifs/MP4, basée sur des calques pour créer de l'art NFT animé ! C'est plus rapide, plus simple et produit des gifs/MP4 de meilleure qualité que tout autre outil génératif animé en open source. Çela contient aussi de nombreuses autres fonctionnalités, y compris, mais sans s'y limiter, l'empilement des calques, les déclarations si-alors, supporte les réseaux ETH/Solana/Tezos, les images d'aperçu, l'insertion de super-rares/légendes faits main, les formats gifs/MP4, et le traitement par lots (batch) pour prendre en charge des centaines de calques et le multitraitement.

Exportez votre animation sous forme de séquence d'images png, organisez vos dossiers de calques avec rareté, et le code fera le reste ! Je prévois de maintenir activement ce dépôt et de l'améliorer avec divers outils pour les mois à venir, alors assurez-vous de poser vos questions dans la discussion et d'y décrire vos problèmes.

Il y a 3 étapes:

  1. [Python] Convertit les calques en spritesheets à l'aide de PIL. Cette étape peut être ignorée si vous avez déjà les spritesheets, mais est utile si vous souhaitez démarrer avec des fichiers png, et facilite la vie de l'artiste !

  2. [Node] Créez des spritesheets génératifs à partir des calques de l'étape 1.

  3. [Python + gifski/ffmpeg] Convertissez les spritesheets en GIF/MP4 en utilisant Python et gifski pour le format GIF ou ffmpeg pour le format MP4 .

Allez voir Medium post and Comment cela fonctionne? pour davantage d'informations!

Voici un exemple de résultat final (vous pouvez aussi télécharger le code, l'exécuter et voir plus de balles rebondissantes :)). Il est également visible surOpenSea.

EDIT l'outil prends maintenant en compte le z-index/stacking, le grouping, les conditions if-then, et les incompatibilités. Voir Cette section pour davantage d'informations. Ci dessous un exemple avec un calque à la fois au dessus et en dessous de la balle.

Samples

Ci-dessous quelques exemples d'autres artistes et développeurs utilisant cet outil pour leurs propres collections! N'hésitez pas à me contacter ou à créer un PR avec vos exemples !

@PxlSyl

Pré-requis

Installez un IDE de votre choix. recommandé

Installez la dernière version de Node Node.js

  • Lancez la commande suivante pour vérifier que Node est bien installé:

      node -v
    

Installez la dernière version de Python Python 3. J'utilise actuellement la 3.8.1 mais tout au dessus de la version 3.6 devrait fonctionnner.

  • Lancez la commande suivante pour vérifier que python est bien installé:

Sous Mac:

    python3 --version 

Sous Windows:

    python --version

Si vous voulez des Gifs en sortie:

Installez gifski. Je recommande l'utilisation de brew brew install gifski si vous êtes sous Mac OSX. Si vous n'avez pas brew vous pouvez l'installer ainsi brew sous Mac OSX. Ou sous Windows vous pouvez l'installer grâce à Chocolatey: choco install gifski.

Sous Linux, certaines personnes ont des soucis avec gifski. Vous allez devoir régler la configuration gifTool sur imageio à la place (instructions plus bas).

Si aucune de ces méthodes ne fonctionnent, suivez les instructions sur gifski Github. Gifski est essentiel car il propose le meilleur outil de génération parmi tout ceux que j'ai pu essayé (PIL, imageio, ImageMagic, librairies js).

Si vous voulez des MP4 en sortie:

Installez ffmpeg. Je recommande l'utilisation de brew brew install ffmpeg si vous êtes sous Mac OSX. Si vous n'avez pas brew vous pouvez l'installer ainsi brew sur Mac OSX. Ou sous Windows vous pouvez l'installer grâce à Chocolatey: choco install ffmpeg.

Si vous envisagez de développer sur ce dépôt, exécutez pre-commit pour installer les hooks de pré-commit.

Si vous êtes sous Windows, vous pouvez éventuellement installer Make en exécutant choco install make. Make est déjà préinstallé sur Mac.

Installation

  • Téléchargez ce dépôt puis extrayez tous les fichiers.

  • Lancez la commande dans le terminal et à la racine du dossier:

      make first_time_setup
    

Si vous avez le moindre problème avec cette commande, essayez de lancer les suivantes séparément :

   python3 -m pip install --upgrade Pillow && pip3 install -r requirements.txt

   cd step2_spritesheet_to_generative_sheet && npm i

Chaque environnement est différent, donc essayez aussi de faire une recherche Google sur votre souci. Ci dessous une liste de problèmes connus:

  • M1 Mac: La préconstruction de Canvas n'est pas conçue pour les ordinateurs ARM donc vous devez l'installer depuis leur Github
  • cd La commande pourrait ne pas fonctionner, selon le terminal que vous utilisez. Vous devrez peut-être éditer Makefile et utiliser CHDIR ou son équivalent.
  • Si vous êtes sur Windows 10 il est possible que 'make' ne soit pas reconnu. Essayez choco install make ou suivez ces instructions. Vous pouvez aussi copier-coller les instructions dans le fichier Makefile manuellement.
  • Si vous êtes sous Windows il est possible que vous obteniez une erreur où 'python3' n'existe pas, essayez de modifier le fichier Makefileet remplacez toutes les occurences de "python3" par "python". Merci!
  • Si brew n'est pas installé, regardez la doc de gifski pour les autres moyens d'installer gifski et regardez la doc de ffmpeg pour les MP4.

Comment lancer le programme?

Déplacez vos fichiers png ou gif dans le dossier /layers ou chaque calque doit lui-même se trouver dans un dossier, et où chaque dossier de traits contient plusieurs dossiers d'attributs, qui eux-mêmes contiennent les images individuelles (frames) du futur GIF, un fichier GIF, ou un fichier PNG . Par exemple si vous voulez définir des calques pour le fonds (background), vous aurez les dossiers /layers/background/blue#20 et /layers/background/red#20.

Dans chaque dossier d'attributs, les frames doivent être nommées ainsi : 0.png -> X.png ou alors : 0.gif. Voir le code ou step 1 pour la structure des dossiers. Le code gérera n'importe quel nombre de calques, vous pouvez donc avoir un calque avec deux frames, un autre calque avec une frame et encore un autre avec 20 frames, et tant que vous passez numberOfFrames = 20, les calques seront répétés jusqu'à ce qu'ils atteignent 20 images par GIF ou MP4.

EDIT Vous pouvez maintenant laisser les noms de vos frames comme vous le souhaitez et définir useFileNumbering sur false. Cela facilite la tâche si vous avez des centaines de frames et que vous ne souhaitez pas les renommer.

Mettez à jour le fichier global_config.json avec:

  1. 'totalSupply' : Nombre total de gifs/MP4 à générer.
  2. 'height' : Hauteur de vos frames. Celle-ci devrait être égale à la largeur. La valeur par défaut est de 350 (voir [https://docs.opensea.io/docs/metadata-standards#:~:text=We%20recommend%20using%20a%20350%20x%20350%20image](OpenSea recommendation))
  3. 'width' : Largeur de vos frames. Celle-ci devrait être égale à la hauteur. La valeur par défaut est de 350 (voir [https://docs.opensea.io/docs/metadata-standards#:~:text=We%20recommend%20using%20a%20350%20x%20350%20image](OpenSea recommendation))
  4. 'framesPerSecond' : Nombre d'images par seconde. Cela ne sera pas exact car PIL prend en millisecondes entières par image. (donc 12 fps = 83,3 ms par image mais arrondi à un int = 83 ms). Cela ne sera pas reconnaissable à l'œil nu, mais mérite d'être signalé.
  5. 'numberOfFrames' : Nombre total d'images. Par exemple, vous pourriez avoir 24 images, mais vous voudriez le ramener à 12 fps.
  6. 'description' : Description pour les métadonnées.
  7. 'baseUri' : baseUri à spécifier dans les métadonnées.
  8. 'saveIndividualFrames' : Utile si vous souhaitez enregistrer les frames finaux individuels, par exemple si vous souhaitez laisser les gens choisir une seul frame pour leur page de profil.
  9. 'layersFolder': C'est le dossier que vous souhaitez utiliser pour les calques. La valeur par défaut est layers, mais cela vous permet d'avoir plusieurs versions/possibilités pour vos calques, et de les exécuter côte à côte. Le dépôt actuel a quatre exemples de dossiers, layers, layers_grouping, layers_if_then, layers_z_index qui démontrent les possibilités du nftchef's repo.
  10. 'quality': Qualité en sortie, 1-100.
  11. 'gifTool': Choisis la méthode de génération, gifski ou imageio. Gifski est meilleur, mais certaines personnes ont des soucis avec sous Linux. Egalement, imageio fonctionnera bien pour le pixel art, donc si vous ne voulez pas télécharger Gifski vous pouvez régler cette option sur imageio.
  12. 'MP4Tool': Choisis la méthode de génération pour les MP4. Supporte seulement ffmpeg pour le moment.
  13. 'outputType': Selectionnez gif ou mp4.
  14. 'useBatches': Réglez sur true si vous souhaitez utiliser le batching. Sinon ne fait rien.
  15. 'numFramesPerBatch': Nombre de frames pour chaque lot (batching). Regardez batching pour plus d'informations. Ne fait quelquechose que si useBatches est réglé sur true.
  16. 'loopGif': true Si vous voulez boucler le gif (lecture en boucle), sinon false.
  17. 'useMultiprocessing': true Si vous voulez utiliser le multi-traitement, ce qui va accélérer les étapes 1 et 3. Vous pouvez configurer le nombre de processeurs à utiliser avec processorCount. Utilisez cela avec parcimonie, je recommanderais d'augmenter lentement processorCount et de monitorer l'usage de votre CPU, car cela pourrait faire crasher votre ordinateur.
  18. 'processorCount': Nombre de processeurs à utiliser avec le multi-traitement. Le goulot est multiprocessing.cpu_count(). Utilisez avec parcimonie.
  19. 'useFileNumbering': Utilisez la numérotation 0.png -> X.png, ou non. Si vous souhaitez uniquement utiliser vos noms de fichiers, définissez-le sur false.
  20. 'enableAudio': BETA. Vous pouvez maintenant ajouter de l'audio en tant que calque. Voir Ajouter un trait audio spécifique pour plus d'informations.
  21. 'numLoopMP4': Nombre de boucles pour vos MP4.

Mettez à jour step2_spritesheet_to_generative_sheet/src/config.js et les lignes de code suivant layerConfigurations. Si vous voulez une configuration basique, éditez simplement layersOrder, mais si vous voulez profiter des possibilités du Nftchef's repo, survolez le fichier afin de visualiser des exemples et modifiez layerConfigurations en conséquence.

  • Pour lancer le processus du début à la fin, en une seule fois:

      make all
    

Vos fichiers de sortie au format Gif apparaitront dans build/gif, et vos fichiers de sortie MP4 apparaitront dans build/mp4.Les métadonnées Json pour ETH et compatibles EVM apparaitront dans build/json. Essayez par vous-même avec les options et calques par défaut!

Si vous voulez jongler entre la génération de Gifs et de MP4, vous pouvez modifier global_config.json, et simplement lancer make step3.

Comment cela fonctionne?

Etape 1

Pour que la partie du code nftchef's Generative Gif Engine fonctionne, les calques en fichiers d'entrée doivent être au format Sprite Sheet. Cependant, cela est fastidieux et peu intuitif pour de nombreux artistes qui utilisent des outils exportant des images individuelles.

L'étape 1 convertit simplement des images individuelles au format spritesheet, avec un pourcentage de rareté. Vous fournissez les calques dans le dossier /layers avec la rareté dans le nom du dossier. Chaque image doit être numérotée de 0 -> X, et n'accepte que le format .png.

Si vous n'incluez pas le pourcentage de rareté dans le nom du dossier d'attributs, cet attribut sera ignoré

Vous pouvez fournir n'importe quel nombre d'images dans chaque dossier de calque, le code les répétera jusqu'à ce qu'il atteigne numberOfFrames. Il coupera également ceux qui ont trop de frames.

Exemple de structure de dossier de calques avec quatre calques et deux traits pour chaque calque :

layers
└───Background
│   └───Grey#50
│       │   0.png
│   └───Pink#50
│       │   0.png
└───Ball
│   └───Blue#50
│       │   0.png
│       │   1.png
│       │   2.png
│       │   ...
│   └───Green#50
│       │   0.png
│       │   1.png
│       │   2.png
│       │   ...
└───Hat
│   └───Birthday#50
│       │   0.png
│       │   1.png
│       │   2.png
│       │   ...
│   └───Cowboy#50
│       │   0.png
│       │   1.png
│       │   2.png
│       │   ...
└───Landscape
│   └───Cupcake#50
│       │   0.png
│   └───Green Tower#50
│       │   0.png

Exemple de calque:

Background:

Grey:

Pink:

Ball:

Blue:

...

Green:

...

Hat:

Birthday:

...

Cowboy:

...

Landscape:

Cupcake:

Green Tower:

J'utilise python ici à la place des librairies javascript parceque je me suis rendu compte que le traitement d'image par le biais de PIL est bien plus rapide, sans perte de qualité. Ces avantages sont beaucoup plus visibles à l'étape 3.

Vous pouvez lancer l'étape 1 grâce à la commande:

    make step1

Cela convertira les fichiers png en spritesheets et la sortie ressemblera à quelque chose comme cela:

Sortie:

Background:

Grey#50.png:

Pink#50.png:

Ball:

Blue#50.png:

Green#50.png:

Hat:

Birthday#50.png:

Cowboy#50.png:

Landscape:

Cupcake#50.png:

Green Tower#50.png:

**EDIT L'outil prends maintenant en compte le z-index/stacking, le grouping et les conditions if-then **. Voir Nftchef's docs pour plus d'informations. Les calques à cette étape devront correspondre au format attendu à l'étape 2. Voir l'exemple de dossier de calques pour plus d'informations.

EDIT prends maintenant en compte les calques au format Gif. Vous pouvez fournir vos calques au format Gif, et le code va les scinder en frames. Voir layers_gif_example. Cela créera un dossier temporaire dans step1_layers_to_spritesheet/temp avec les frames séparées au format png, et les analysera dans ce dossier afin de créer les fichiers de sortie. Vérifiez bien d'avoir réglé numberOfFrames dans le fichier global_config.json.

Etape 2

L'étape 2 prend les spritesheets de l'étape 1 et génère toutes les combinaisons possibles en fonction de la rareté. C'est ici que toute la magie opère ! En sortie cela crée une multitude de spritesheets avec tous les calques superposés les uns sur les autres.

L'idée originale vient de MichaPipo's Generative Gif Engine mais maintenant la majeure partie du code a été forkée depuis nftchef's Generative Engine, qui est lui-même un fork du HashLips Generative Art Engine. S'il vous plaît, allez voir Hashlip 📺 Youtube / 👄 Discord / 🐦 Twitter / ℹ️ Website pour une explication plus détaillée sur le fonctionnement général.

J'ai récemment modifié cette partie du code du Nftchef's Generative Engine, ce qui ajoute les possibilités suivantes:

  • Déclarations if-then. Vous pouvez avoir un code d'art génératif qui dit "si ce calque..." , alors cet autre calque sera selectionné. Il y a un exemple de calques sous layers_if_then qui a la logique suivante : si la balle est rose, porte un "birthday" ou un "cowboy hat", ou si la balle est violette, alors porte un "mini ball hat". Voir Nftchef's docs pour plus d'informations.
  • Déclarations par groupes. Vous pouvez maintenant regrouper vos traits dans des groupes spécifiques. Ainsi dans le layers_grouping nous avons des balles et des chapeaux communs, des balles et chapeaux rares, le premier totalSupply - 1 est commun, et le dernier est rare. Cela sortira dans l'ordre, mais vous pouvez les mélanger en réglant shuffleLayerConfigurations dans config.js sur true.
  • z-index, qui correspond à l'ordre d'empilement. Vous pouvez maintenant avoir plusieurs ordres d'empilement pour le même calque, par exemple un panier de basket, qui a des parties plaçées au dessus et en dessous de la balle. Voir Nftchef's docs pour plus d'informations.

Vous devrez mettre à jour global_config.json etlayerConfigurations dans step2_spritesheet_to_generative_sheet/src/config.js.

Vous pouvez lancer l'étape 2 grâce à la commande:

    make step2

Exemple de sortie avec le dossier layers (seuls les 4 premiers sont montrés, il y en a 16 au total):

Exemple de sortie avec le dossier layers_z_index:

Etape 3

L'étape 3 prends les spritesheets de l'étape 2 et produit les gifs/MP4. Initialement j'utilisais PIL, mais j'ai eu des soucis concernant la qualité d'image.

Dans le dépôt original de MichaPipo, ce sont des bibliothèques javascript qui ont été utilisées pour créer les gifs. Celles-ci copiaient pixel par pixel, et la logique était un peu compliquée. Créer seulement 15 gifs prenait 4 minutes, et j'ai pu remarquer que certaines des couleurs hexadécimales des pixels étaient désactivées. Également : en fonction de l'utilisation du processeur, le programme plantait. J'ai passé des jours entiers à déboguer, avant de décider de repartir de zéro dans un autre langage.

J'ai ensuite essayé Imageio et quelques bibliothèques Python, mais elles avaient toutes des problèmes pour générer des gifs.

J'ai passé des semaines à trouver le meilleur outil pour ce travail, puis j'ai découvert gifski. Cela crée des gifs incroyablement propres et fonctionne pour le mieux.

Maintenant, générer 15 gifs prend moins de 30 secondes et s'affiche avec une qualité de pixel parfaite !

Vous pouvez modifier le framesPerSecond dans global_config.json et vous pouvez exécuter l'étape 3 avec la commande :

    make step3

Cela vous permet de ne pas avoir à tout régénérer pour jouer avec les fps.

Exemple de sortie avec les 16 permutations (cliquez sur chaque gif pour la version 1000x1000) :

Si vous définissez saveIndividualFrames sur true dans global_config.json, cela divisera également les gifs en frames individuelles et les enregistrera dans images. Ceci est utile si vous voulez que les gens puissent choisir une seule frame pour une photo de profil.

Quelques données:

Le dépôt de MichaPipo:

  • 15 NFT - 5 minutes avec parfois des pixels incorrects.
  • 100 NFT - une heure (avec l'ordinateur presque inutilisable).

Le nouveau générateur de gifs:

  • 15 NFT - 30 secondes et pas de problèmes de pixels.
  • 100 NFT - 3 minutes and 17 secondes sans problèmes de pixels.
  • 1000 NFT - 45 minutes sans problèmes de pixels ni de CPU.

REMARQUES imageio était de loin la meilleure librairie python, je l'ai donc ajoutée en option au cas où vous ne voudriez pas télécharger gifski. imageio fonctionnera bien la plupart du temps pour le pixel art et je sais que certaines personnes ont eu des soucis avec gifski sous Linux (mais pas sous Windows ou Mac).

Vous pouvez définir l'outil gif à utiliser dans global_config.json en définissant gifTool sur gifski (par défaut) ou imageio.

Si vous souhaitez basculer entre la génération de gif et celle de MP4, vous devez remplacer outputType par mp4 et exécuter uniquement make step3.

améliorations avec NFTChef : z-index/stacking, grouping, déclarations if-then, et incompatibilité

L'outil propose maintenant le z-index/stacking, le grouping, les déclarations if-then, et les incompatibilités. Voir Nftchef's docs pour plus d'informations.

Si vous ne voulez pas lire la doc:

  • z-index/stacking: Vous pouvez avoir le même calque au dessus et en dessous d'un autre calque (voir basketball au-dessus). Vous devez spécifier z_, devant le nom, par exemple z1, ou z2,. Voir layers_z_index pour un exemple, et essayez de régler layersFolder sur layers_z_index pour le voir en action et vérifiez layerConfigurationsZIndex dans config.js pour la configuration.
  • grouping: Vous pouvez regrouper les traits ensemble dans un groupe, comme communs/rares. Ensuite vous pouvez spécifier combien vous voulez en quantité pour chacun d'entre eux. Voir le dossier layers_grouping et layerConfigurationsGrouping dans config.js.
  • if-then: Vous pouvez spécifier "si ce trait"... "Alors il aura cet autre trait". Par exemple, "si la balle est rose", alors le code choisira parmi "ces deux chapeaux". Voir le dossier layers_if_then et layerConfigurationsIfThen dans config.js.
  • incompatibilités: Vous pouvez spécifier si vous souhaitez qu'un calque soit incompatible avec un autre calque. Par exemple, si vous ne voulez pas que l'arrière-plan clignotant ait une balle multicolore. REMARQUE: cela ne fonctionnera que si les noms de calques sont tous uniques, sinon cela pourrait entraîner un comportement inattendu. Voir layers_incompatible et const incompatible dans config.js. Vous pouvez dé-commenter la ligne et exécuter le code avec layersFolder réglé surlayers_incompatible pour voir ceci fonctionner.

Ajouter un audio spécifique pour un trait

🧪 OPTION BETA

Vous pouvez maintenant ajouter un son spécifique par trait. Par exemple, si vous voulez des bruits de vent avec un fond venteux, et des bruits de forêt avec un fond forestier.

Placez simplement le fichier audio dans le dossier de calque correspondant, et l'étape 3 le prendra et le mettra sur le mp4. Vous pouvez voir un exemple dans le dossier layers_audio. Essayez en réglant layersFolder sur layers_audio et enableAudio sur true, ensuite lancez make all. Le mp4 sera de la même longueur que le total des frames, et l'audio sera tronqué s'il est trop long.

L'outil prend en charge mp3, wav et m4a. S'il existe plusieurs fichiers audio pour le même NFT, il combinera les fichiers audio et les superposera.

Etendre une collection existante en GIF/MP4

🧪 OPTION BETA

Video Walkthrough

Si vous avez des métadonnées existantes pour une collection existante et que vous souhaitez soit créer une nouvelle collection avec des GIF/MP4, soit envoyer une version GIF/MP4 de l'image statique aux détenteurs, cette fonctionnalité est pour vous ! OU si vous souhaitez exporter sous forme de spritesheet pouvant être importée dans un métaverse pixel, cette fonctionnalité est faite pour vous !

Il existe quelques configurations pour que vous puissiez utiliser l'outil :

  1. Si vous avez déjà un _dna.json généré par le dépôt de NFT Chef, et un fichier _metadata.json qui contient tous les fichiers JSON. Chargez le _dna.json dans le dossier build et chargez le _metadata.json dans le dossier build/json. Configurez vos calques en suivant le format ci-dessus. Configurez global_config.json et config.js et exécutez make regenerate. C'est le moyen le plus précis et le plus cohérent pour générer des GIF basés sur des calques existants et fonctionnera avec les spécificités de NFT Chef.
  2. Si vous avez généré en utilisant le générateur d'art de Hashlips, vous n'aurez pas de _dna.json. Vous n'aurez que _metadata.json qui contient tous les fichiers JSON. Chargez le dans le dossier build/json, configurez vos calques, configurez global_config.json, config.js et exécutez make regenerate. Cela permets d'essayer de régénérer le DNA basé sur le JSON. Cela devrait fonctionner, mais il peut y avoir des fonctionnalités qui ne sont pas rétrocompatibles, alors faites-le moi savoir si vous rencontrez un souci.
  3. Vous n'avez pas de fichier _metadata.json. Chargez tous les fichiers .json individuels dans build/json. Configurez vos calques, configurez global_config.json, config.js et exécutez make regenerate. C'est plus ennuyeux à faire (si vous avez une tonne de fichiers), mais cela régénérera le _metadata.json, le _dna.json, puis régénérera votre collection.

Si vous souhaitez ne régénérer que les spritesheets, vous pouvez définir SKIP_STEP_ONE sur True et SKIP_STEP_THREE sur True dans regenerate.py. Alors à la place de mettre vos calques dans le dossier layers, vous les mettez dans step1_layers_to_spritesheet/output en tant que calques entiers, puis exécutez faire régénérer. Les spritesheets seront dans step2_spritesheet_to_generative_sheet/output.

Si vous avez besoin de plus de 32 images à 1000x1000, suivez la configuration par lots (batch), puis exécutez "make regenerate". Cela ne fonctionnera que si vous suivez toutes les étapes sans en sauter aucune.

S'il vous plaît faite-le moi savoir si vous avez des soucis ou des cas d'utilisation auxquels je n'ai pas pensé.

Statistiques de rareté

Vous pouvez vérifier les statistiques de rareté de votre collection avec :

    make rarity

Exclure un calque du DNA

Si vous souhaitez qu'un calque soit ignoré dans la vérification de l'unicité du DNA, vous pouvez définir bypassDNA : true dans l'objet options. Cela permets de s'assurer que le reste des traits est unique sans considérer les calques de fonds Background comme des traits, par exemple. Les calques seront inclus dans l'image finale.

layersOrder: [
      { name: "Background" },
      { name: "Background" ,
        options: {
          bypassDNA: false;
        }
      },

Generation de hashage de provenace

Si vous avez besoin de générer un hachage de provenance (et, oui, vous devriez, lire à ce sujet ici ), exécutez l'utilitaire suivant:

make provenance

Cela ajoutera un imageHash à chaque fichier .json, puis les concaténera et hashera la valeur du fichier en une chaîne (string), qui sera le "hashage de provenance".

Les informations de provenance sont enregistrées dans le répertoire de construction dans _provenance.json. Ce fichier contient le hashage de provenance final ainsi que la longue chaîne (string) de hashage concaténée.

*Remarque, si vous régénérez les gifs, Vous devrez également régénérer ce hashage.

Enlever un trait

Si vous devez supprimer un trait des attributs générés pour TOUS les fichiers .json de métadonnées générés, vous pouvez utiliser la commande removeTrait util.

cd step2_spritesheet_to_generative_sheet && node utils/removeTrait.js "Nom du trait"

Si vous souhaitez imprimer des logs supplémentaires, utilisez l'indicateur -d

cd step2_spritesheet_to_generative_sheet && node utils/removeTrait.js "Nom du trait" -d

Mettre à jour les métadonnées

Vous pouvez changer la description et le base Uri de vos métadonnées même après avoir lançé tout le code en mettant à jour global_config.json et en executant la commande:

    make update_json

Insérer aléatoirement des objets rares - Replace Util

Si vous souhaitez ajouter manuellement des versions "dessinées à la main" ou uniques dans le pool d'éléments générés, cet utilitaire prend un dossier source (celui de vos nouvelles illustrations) et l'insère dans le répertoire "build", en les attribuant à des identifiants aléatoires.

Requirements

  • Placez vos gifs dans ultraRares/gifs
  • Placez les fichiers json correspondants dans les dossiers ultraRares/json

example:

├── ultraRares
│   ├── gifs
│   │   ├── 0.gif
│   │   └── 1.gif
│   └── json
│       ├── 0.json
│       └── 1.json

Vous devez avoir les fichiers json correspondants pour chacun de vos gifs/éléments.

Configuration du JSON.

Étant donné que ce script randomise les jetons à remplacer/placer, il est important de mettre à jour correctement les métadonnées avec le tokenId résultant #.

Partout où vous avez besoin du numéro d'édition dans les métadonnées, utilisez l'identifiant ##.

  "edition": "##",

N'oubliez pas l'URI de vos images!

  "name": "## super rare sunburn ",
  "image": "ipfs://NewUriToReplace/##.png",
  "edition": "##",

Executer

Lancez la commande make replace. Si vous devez remplacer le nom du dossier, vous devrez peut-être modifier le Makefile directement avec le dossier.

Notez que cela ne mettra pas à jour _dna.json car ces nouveaux JSON n'ont pas d'ADN. Cela modifiera cependant _metadata.json.

Metadonnées pour Solana

🧪 OPTION BETA

Après avoir exécuté "make all", vous pouvez lancer la génération des métadonnées Solana en deux étapes :

  • Modifiez step2_spritesheet_to_generative_sheet/Solana/solanaConfig.js
  • make solana pour générer les métadonnées Solana. Cela créera un dossier de sortie build/solana avec les gifs et les métadonnées.

La plupart du code provient de nftchef.

Je n'ai essayé cela sur aucun réseau de test ou principal Solana, veuillez donc signaler tout problème ou créer un PR pour les résoudre !

Tezos metadata

🧪 OPTION BETA

Je n'ai pas essayé cela sur un réseau de test ou principal Tezos, alors veuillez signaler tout problème ou créer un PR pour les résoudre !

Voir Tezos README pour plus d'informations.

Lots (Batching)

Voulez-vous une résolution plus élevée, plus d'images et des gifs/MP4 plus grands ? Le batching est fait pour vous ! Actuellement, le step2 est limité à des fichiers de 32 000 pixels. Donc pour contourner ce problème, nous devons regrouper l'ensemble du processus en plusieurs parties, puis les combiner à la fin.

Définissez useBatches dans global_config.json sur true, puis définissez numFramesPerBatch sur un nombre pair de numberOfFrames.

Ensuite, lancez make all_batch. Cela exécute d'abord make step1 + make step2 pour générer les métadonnées initiales, puis python3 batch.py qui va créer les images restantes en fonction des métadonnées initiales.

Aperçu Gif/MP4

Si vous voulez un aperçu gif/MP4 d'un sous-ensemble de gifs (comme avec le Hashlips), lancez la commande:

make preview

Cela affichera preview.gif/preview.mp4 dans le dossier build. Le nombre d'aperçus par défaut est de 4, mais vous pouvez le modifier dans step3_generative_sheet_to_output/preview.py en haut NUM_PREVIEW_OUTPUT. Actuellement, il sélectionnera au hasard les gifs/MP4, si vous voulez le premier X en sortie, définissez SORT_ORDER sur OrderEnum.ASC et si vous voulez le dernier X en sortie, définissez SORT_ORDER sur OrderEnum.DESC.

REMARQUES IMPORTANTES

Tout le code des étapes 1 et 3 a été écrit par moi-même. L'idée originale du dépôt vient du MichaPipo's Generative Gif Engine mais la plupart du code de l'étape 2 est maintenant dérivé du [nftchef's Generative Engine](https://github .com/nftchef/art-engine) qui est lui-même dérivé du HashLips Generative Art Engine.

FAQ

Q : Pourquoi avez-vous décidé d'utiliser Python pour les étapes 1 et 3 ?

R : J'ai trouvé que Python PIL fonctionne mieux et plus rapidement que les bibliothèques JS, et le code est plus simple pour moi. Au départ, j'ai essayé PIL, imageio et quelques bibliothèques Python, mais elles avaient toutes des problèmes concernant la génération de gifs. J'ai passé des semaines à trouver le meilleur outil pour ce travail et je suis tombé sur gifski. Cela permets la création de gifs incroyablement propres et fonctionne le mieux.

Ma philosophie est de choisir le bon outil pour le bon travail. Si quelqu'un trouve une meilleure bibliothèque pour ce travail spécifique, faites-le moi savoir !

Q : Pourquoi n'avez-vous pas utilisé Python pour l'étape 2 ?

R : La communauté de développement NFT qui écrit la logique compliquée de l'art génératif code principalement en javascript. Je veux faciliter la mise à jour de mon code et incorporer les meilleures fonctionnalités des autres dépôts aussi facilement que possible, et tout refaire en Python serait fastidieux. Imaginez les étapes 1 et 3 comme des outils d'assistance en Python, et l'étape 2 est à l'origine de la majeure partie de la logique de développement.

Q : Quels types de fichiers prenez-vous en charge ?

Type d'entrée : gif ou png

Type de sortie : gif ou MP4

Q : Quels réseaux sont supportés ?

Ethereum, Solana, Tezos.

Assurez-vous de me suivre pour plus de mises à jour sur ce projet :

Twitter

GitHub

Moyen

Mon adresse ETH est 0x4233EfcB109BF6618071759335a7b9ab84F2F4f3 si vous avez envie d'être généreux :). Je viens de quitter mon travail pour travailler à plein temps sur les NFT donc tout est apprécié.

Si vous voulez voir ce code en action, nous l'utilisons pour mon entreprise de fitness et de santé mentale Fitness Friends. Rejoignez le Discord si vous avez besoin d'aide avec le moteur d'art animé, vous pouvez obtenir un accès direct à moi dans le canal #dev :

Twitter

Site Web

[Discord] (discord.gg/Nn36NUK9ba)

TRADUCTION FR

Pxlsyl

NB.:

-Si vous avez des questions, ou besoin d'aide en français, vous pouvez poser vos questions sur mon Discord, ou sur celui de Ben BK où je suis instructeur.

-Si vous cherchez quelqu'un de compétent et sérieux pour créer une collection pour votre projet, n'hésitez pas à me contacter! Je suis spécialisé dans l'illustration traditionnelle et le Pixel Art. Je fais également du numérique et du Concep Art, et du travail avec intelligence artificielle. Je fais aussi un peu de dev pour mes projets personnels.

Mes liens :

Twitter

Site Web

[Discord] (https://discord.gg/agkZjACtwA)

Et si vous voulez me remercier pour mon implication au sein de la communauté FR, aucune obligation, mais voici mon adresse Eth :) :

0x9Fa388136659F601573bcaDa792f68d4EE1eDac9