[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:
-
[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 !
-
[Node] Créez des spritesheets génératifs à partir des calques de l'étape 1.
- L'idée originale vient du MichaPipo's Generative Gif Engine mais actuellement la plupart du code de cette étape est dérivé de [Nftchef's Generative Engine](https://github.com /nftchef/art-engine), lui-même dérivé du HashLips Generative Art Engine. Veuillez consulter Hashlip's 📺 Youtube / 👄 Discord / 🐦 Twitter / ℹ️ Website pour des explications plus détaillées sur le fonctionnement du processus de génération.
-
[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.
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 !
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.
-
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 éditerMakefile
et utiliserCHDIR
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 fichierMakefile
manuellement. - Si vous êtes sous Windows il est possible que vous obteniez une erreur où 'python3' n'existe pas, essayez de modifier le fichier
Makefile
et 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.
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:
'totalSupply'
: Nombre total de gifs/MP4 à générer.'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))'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))'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é.'numberOfFrames'
: Nombre total d'images. Par exemple, vous pourriez avoir 24 images, mais vous voudriez le ramener à 12 fps.'description'
: Description pour les métadonnées.'baseUri'
: baseUri à spécifier dans les métadonnées.'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.'layersFolder'
: C'est le dossier que vous souhaitez utiliser pour les calques. La valeur par défaut estlayers
, 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.'quality'
: Qualité en sortie, 1-100.'gifTool'
: Choisis la méthode de génération,gifski
ouimageio
. 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 surimageio
.'MP4Tool'
: Choisis la méthode de génération pour les MP4. Supporte seulementffmpeg
pour le moment.'outputType'
: Selectionnezgif
oump4
.'useBatches'
: Réglez surtrue
si vous souhaitez utiliser le batching. Sinon ne fait rien.'numFramesPerBatch'
: Nombre de frames pour chaque lot (batching). Regardez batching pour plus d'informations. Ne fait quelquechose que siuseBatches
est réglé surtrue
.'loopGif'
:true
Si vous voulez boucler le gif (lecture en boucle), sinonfalse
.'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 avecprocessorCount
. Utilisez cela avec parcimonie, je recommanderais d'augmenter lentementprocessorCount
et de monitorer l'usage de votre CPU, car cela pourrait faire crasher votre ordinateur.'processorCount'
: Nombre de processeurs à utiliser avec le multi-traitement. Le goulot estmultiprocessing.cpu_count()
. Utilisez avec parcimonie.'useFileNumbering'
: Utilisez la numérotation 0.png -> X.png, ou non. Si vous souhaitez uniquement utiliser vos noms de fichiers, définissez-le surfalse
.'enableAudio'
: BETA. Vous pouvez maintenant ajouter de l'audio en tant que calque. Voir Ajouter un trait audio spécifique pour plus d'informations.'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
.
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.
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 premiertotalSupply - 1
est commun, et le dernier est rare. Cela sortira dans l'ordre, mais vous pouvez les mélanger en réglantshuffleLayerConfigurations
dansconfig.js
surtrue
. - 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
:
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
.
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 exemplez1,
ouz2,
. Voirlayers_z_index
pour un exemple, et essayez de réglerlayersFolder
surlayers_z_index
pour le voir en action et vérifiezlayerConfigurationsZIndex
dansconfig.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
etlayerConfigurationsGrouping
dansconfig.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
etlayerConfigurationsIfThen
dansconfig.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
etconst incompatible
dansconfig.js
. Vous pouvez dé-commenter la ligne et exécuter le code aveclayersFolder
réglé surlayers_incompatible
pour voir ceci fonctionner.
🧪 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.
🧪 OPTION BETA
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 :
- 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 dossierbuild
et chargez le_metadata.json
dans le dossierbuild/json
. Configurez vos calques en suivant le format ci-dessus. Configurezglobal_config.json
etconfig.js
et exécutezmake 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. - 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 dossierbuild/json
, configurez vos calques, configurezglobal_config.json
,config.js
et exécutezmake 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. - Vous n'avez pas de fichier
_metadata.json
. Chargez tous les fichiers.json
individuels dansbuild/json
. Configurez vos calques, configurezglobal_config.json
,config.js
et exécutezmake 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é.
Vous pouvez vérifier les statistiques de rareté de votre collection avec :
make rarity
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;
}
},
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.
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
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
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.
- 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.
É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": "##",
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.
🧪 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 sortiebuild/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 !
🧪 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.
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.
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
.
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 :
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 :
[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 :
[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