インタラクティブなドット絵をぜひお試しください【p5.js】

## ドット絵 x p5.js

師走に入りましたね。
早速ですがこちらのイラストをご覧ください。


※イラスト上でマウスを動かすと変化があります。スマホ等の場合はタッチで。
※何も映らない場合は「Rerun」してください。



<p class="codepen" data-height="600" data-theme-id="dark" data-default-tab="result" data-slug-hash="GRzdoZN" data-user="me-no" style="height: 600px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/me-no/pen/GRzdoZN">
  Untitled</a> by Meno (<a href="https://codepen.io/me-no">@me-no</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## これなに

↑はドット絵をJavaScript ライブラリの `p5.js` によって動かしたものになります。

筆者は日ごろドット絵を描いたりなどしているものです。

https://twitter.com/RyntaloL

[Instagram](https://www.instagram.com/__hackle.pixel/)   /    [Threads](https://www.threads.net/@__hackle.pixel)

生活のためにSEの仕事もしており、昨年からドット絵にコーディングを取り入れたイラストづくりを始めました。
Processing によるジェネラティブアートに惹かれたのが始まりだったこともあり、専らp5.js を使って作品を描いています。


今回はこちらのアドベントカレンダーの、12月1日分の記事を書きます。

https://qiita.com/advent-calendar/2023/my_creative_coding


## 作品づくりのこだわり

### ドット絵らしくあること

p5.js で図形を描くと、通常は滑らかな曲線になります。

![滑らかな曲線の場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/ed43b434-c845-5794-e520-b616c7a895d0.png)


ドット絵は1ピクセルが目視で分かるぐらいに強調された、解像度の低い *"ピクセルアート"* なので、図形が描画される位置に制限を加えて、滑らかでないドット絵の曲線になるよう処理を加えています。

![ドット絵らしさを残した場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/29193b41-11e8-97dc-8f04-0a0931ffc53f.png)


### アクションが無くても画として成立すること

インタラクティブアニメーションをつくるにあたって、ユーザの操作によって初めて描画される要素も用意はしますが、それが無かった場合でも1枚の画が徐々に出来上がっていく過程を楽しんでもらえるようなアニメーションを心掛けています。

##### ●ユーザからのアクションが無い場合

<img width="280" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/f23ede67-3882-74c6-4fe0-a97e69dae537.png">

　　　↓

<img width="280" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/256d50fb-d39b-31d8-2f7e-1cdc20f91e0e.png">

　　　↓

<img width="280" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/35023a2f-72f2-004d-5e0a-d629c426b461.png">

##### ●アクションがあった場合

<img width="280" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/65fda16a-962b-2943-de50-20283c24668d.png">

## 作品づくりの変遷

学生時代に数学を専門にしていたこともあり、イラストにもサインカーブなんかを取り入れることが度々ありました。

<img width="360" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/6865c2fe-2775-b093-13ae-e196d6246adc.png">

ただ毎回サインカーブでも芸がないと思っていた矢先、出合ったのがジェネラティブアートのジャンルでした。


https://twitter.com/RyntaloL/status/1507088864199917582?ref_src=twsrc%5Etfw

https://x.com/RyntaloL/status/1509521392756146185?s=20


```※ちなみに最後の数枚は明らかにダミアン・ハーストから色を抽出しています。```



勉強し始めた当初はもっと、複雑かつ綺麗な曲線をドット絵に取り入れんとする意気込みだったのですが、気づけば結局サインカーブを多用する日々です。

![eel.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/c87e5fcb-803a-e9a5-cf7e-4e27464839ff.gif)


```↑サインカーブに沿ってイラストを並べただけ```


つまり **技術的には大したことやっていない** のですが、それでも単純なプログラムの組み合わせで思いがけず綺麗な画になったりするのはp5.js の面白いところだと感じます。


![rosecurve.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/7c91c136-cf23-b607-8439-00b5cae52f7d.gif)


` ↑ローズカーブが描きたかった絵。背景はサインカーブとランダムな四角形を描画しているだけです。`


:::note
ちなみにp5.js を始めてから、普段の業務におけるJavaScript の読解力がちょっとだけ上がりました。（いい話）
:::

## "ユニーク"なデジタルアートをつくること

私にとってのクリエイティブコーディングの面白いところは何より、ゲームのようなスケールではないけれど、 **鑑賞する側の動きに依存して変化する、ある種の動的なイラストをつくれるところ** にあります。

デジタルイラストはいくらでも複製できますが、ランダム関数で毎回違った模様を形成したり、鑑賞者自身にイラストに変化を加えてもらうことで、NFTのようなコンセプトとは違った形でデジタル作品に一意性を見出してもらえるんじゃないかと思っています。


## 補足など

#### p5.js 勉強会

ドット絵とp5.js に関しては6月に「p5.js勉強会」にて軽くお話しているので良ければご覧ください。

https://www.youtube.com/live/B4QCkI_ymdo?si=XNs2yS_xiGG6ZnkX


#### 出展

12月3日（日）に COMITIA146＠東京ビッグサイト で合同画集を出します。タブレットを持参してp5.js 作品の展示も検討しているので、こちらも良ければお立ち寄りください。

画集の一作品を先取りして公開。WASDでちょっとだけ動きます。（絵を一度クリックしてアクティブにしてからお試しください。）

<p class="codepen" data-height="600" data-theme-id="dark" data-default-tab="result" data-slug-hash="MWLGXVw" data-user="me-no" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/me-no/pen/MWLGXVw">
  astro</a> by Meno (<a href="https://codepen.io/me-no">@me-no</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


お読みくださりありがとうございました。

## 関連記事

https://note.com/lyntaro/n/n77459957c05b

https://note.com/lyntaro/n/nc0c78ec29a13

https://note.com/lyntaro/n/n27bd52fe626f

https://zenn.dev/meno/articles/eda9f6e14b63a1