Generative NFT Collection の作り方
0. はじめに、この記事について
9月17日金曜日の夜、Tiny Dino Clubという名前で小さな恐竜のドット絵がリリースしました。
それから3週間後に、Tiny Dino Club / Generativeという名前で初日に100頭のGenerative Avatorをリリースしました。1,000頭をドロップ予定で、現在随時ドロップを続けています!
私自身は、普段はWebエンジニアとして仕事をしながら、42 Tokyoというパリ発・学費無料の新興のエンジニア養成機関の学生としても活動しています。余談ですが最高の環境が待っているので、興味ある方はぜひ見てみてください!
今回は個人的な繋がりからこのNFTプロジェクトにエンジニアとして参加させて頂いています。
この記事は、実際にジェネラティブ NFT コレクションを立ち上げる際の生成方法についての記事になります。この記事が少しでも、これからNFTコレクションを制作する方の力になれれば幸いです!
1. パーツ構成を考える
まず初めに、一体のアバターの元となるパーツの構成を決めていきます。
ジェネレーティブ NFT コレクション では、大きく「ベースとなるパーツ」と、「デコレーションで利用するパーツ」を用意します。基本的にベースとなるパーツの要素数によって、最終的に生成されるアバターの総数が決まってきます。
例として、Tiny Dino Club / Generative の初回シリーズ100体は、以下のような構成で生成されています。ベースとなるパーツが4種類あるため、それぞれ5種類ずつ変化を持たせたとすると、5の5乗で少なくとも3125通りのアバターが生成されることになりますね!
ベースとなるパーツ
- 背景
- 体色
- 背びれ
- 服
デコレーションで利用するパーツ
- 目
- 口
- アイウェア
- 靴
- 帽子
2. 部位ごとのアイテムをPNGファイルで作成する
1で決めたパーツ構成を元に、実際のアイテムを作画していきます。画像生成時にこれらのアイテムをレイヤーを重ねるようにして生成していくので、レイヤーとアイテムの位置を意識して作画していきます。画像のサイズは全て同じサイズに統一します。ファイル形式は、透過ファイルの一種であるPNG形式のファイルを使用します。
全ての作画が完了したら、パーツをフォルダごとに分けて保存します。
これで、パーツの準備は完了です!
3. Collectionの生成スクリプト実行
以下のGithubリポジトリをダウンロードして、実行していきます。ここでは、お使いのPCに、ruby, git, gem がインストールされている状態を想定しています。
3.1 ターミナルを開いたら、以下を実行して、リポジトリをダウンロードします。
git clone https://github.com/dofuta/comb_image_generator.git
3.2 パッケージマネジャーをダウンロード / インストールします。
gem install bundler
3.3 パッケージをダウンロード / インストールします。
bundle install
3.4 ここまでで、スクリプトを実行する手筈が整いました。
ファイル構成は以下のようになっています。
comb_image_generator
├── Gemfile
├── Gemfile.lock
├── README.md
├── assets # 画像パーツを格納するディレクトリ
├── config.yml # 設定を記載するファイル
├── generate.rb
└── results # 結果が格納されるディレクトリ
重要なのは、以下の3つです。
assets → 画像パーツを格納するディレクトリ
config.yml → 設定を記載するファイル
results → 結果が格納されるディレクトリ
3.4 assets フォルダの直下に、以下のように画像パーツのフォルダを格納します。
3.5 config.yml ファイルをテキストエディターで開いて、中身を以下の通りに編集します。インデントやスペースの数も重要なので、正確に編集してください。
max_result_num: 10000
assets_path: "./assets"
files:
items_base:
- "1_背景"
- "2_体色"
- "3_背びれ"
- "4_服"
items_deco:
- "5_目"
- "6_口"
- "7_アイウェア"
- "8_靴"
- "9_帽子"
items_base:
ベースとなるアイテムが格納されているフォルダ名を登録します。このフォルダの数を増やせば増やすほど(つまりアイテムのレイヤーを増やせば増やすほど)生成される画像の数も増えていきます。
*このレイヤーのアイテムは、「1アイテムだけ違う」状態のアバター(例えば「背景」だけが違くて、あとは全て同じアイテムで構成されたアバター)を「1通り」として認めるアルゴリズムが適用されるように作られています。
items_deco:
デコレーションで利用するアイテムが格納されているフォルダ名を登録します。見た目の変化が少ないレイヤー(例えば、靴とか、目とか、耳とか)をここに設定すると良いです。
*このレイヤーのアイテムは、「1アイテムだけ違う」状態のアバター(例えば、「靴」だけが違くて、あとは全て同じアイテムで構成されたアバター)は「1通り」として認めないようなアルゴリズムが適用されるように作られています。
max_results_num:
画像生成の最大数を設定できます。例えば10に設定すると、画像が10個しか生成されなくなります。
assets_path:
部位ごとの画像を保存するフォルダ名をここで設定できます。基本は触らずそのままで大丈夫です。
3.6 実際に生成スクリプトを実行します。
bundle exec ruby generate.rb
3.6 すると、以下のようなメッセージとともに画像が生成されていきます。
tdc [main*]$ bundle exec ruby generate.rb
3240 images will be generated...
Generating [======== ] SUCCESS ./results/0.png
Generating [======== ] SUCCESS ./results/1.png
Generating [======== ] SUCCESS ./results/2.png
Generating [==== ]
3.7 PCのスペックとアイテムレイヤーの数にもよりますが、1000通り生成するのに、大体1時間 - 2時間くらい、ファンをグルグル回しながら頑張ってくれます。
その間は、こんな感じでPCを冷やして休ませてあげてください。
3.8 画像の生成を途中で辞めたくなったら、コントロールキーとCを同時に押してあげると、止まります。
Ctrl + C
3.9 生成されたアバターは、resultsフォルダに格納されています!