最先端のライフゲーム(Particle Lenia)を作ったので眺める

## はじめに
この記事は、[Akatsuki Games Advent Calendar 2023](https://adventar.org/calendars/8724) の13日目の記事です。
昨日の記事は、スーさんの「[DoxygenでC++クラスを分析し、GitHub ActionsでPRコメントする仕組みを作ってみました](https://hackerslab.aktsk.jp/2023/12/12/095300)」でした。”GitHub Actionsで自動的にPRにコメントする仕組み”、業務フローの改善など応用が効きそうで、とても素敵ですね..！絶対読むべきです。
<br>

この記事では、  
- ものの動きや形が好き  
- 最先端のライフゲームが気になる  

といった人を対象として、2022年に発表された最先端？のライフゲーム(Particle Lenia)について簡単に説明します。そして、Unityで作成したものを眺めます。

## Particle Leniaまで超ざっくり解説  
### そもそもライフゲームってなに？？
Particle Leniaについて説明する前に、そもそもライフゲームとは何かを説明する必要があります。  
ライフゲームとは、1970年に数学者のJohn Horton Conwayが考案した、生命プロセスを（超簡易的に）再現するグリッドベースのシミュレーションです。  

グリッドの各マス目には「生」と「死」の2つの状態があり、あるマス目の次のステップの状態を、近接の8つのマス目の状態から以下のルールに基づき更新します。
- 死→生になる条件:近接の3つのマス目が生。（誕生）
- 死→死になる条件:上以外。
- 生→生になる条件:近接の2もしくは3つのマス目が生（維持）
- 生→死になる条件:上以外。（過疎、過密）

ライフゲームは、上のような簡単なルールで実装できるにもかかわらず、「移動」「繁殖」「振動」など、生命現象に共通する多くのパターンを再現できることが知られています。

<br>
youtubeで上の方に出てきたライフゲームの動画を添付しておきます。
<iframe width="400" height="400" src="https://www.youtube.com/embed/ZOkm867AleM" title="ライフゲーム入門 (Introduction The Game of Life)" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
ただのライフゲームの時点で、すでに素敵ですね。

### Leniaってなに？？
次にParticle Leniaについて説明したいところですが、Leniaについても説明する必要があります。  
Leniaとは、ライフゲームを時空間共に連続的に表現したもの、いわば「ライフゲームの連続版」です。ライフゲームにおけるグリッドの1マスがLeniaでは空間上の1点に対応し、近接の定義や、生死を決定するルールが連続的な関数で表現されます[1]。
これにより、Conweyのライフゲームではみられないような、複雑な動き/形態を表現できるようになります。

[こちらのサイト](https://chakazul.github.io/Lenia/JavaScript/Lenia.html)で遊ぶことができます。Leniaのパラメータセットに、それっぽい種名や科名がついていておもしろいです。  

[1]の著者であるBertChanさんのYoutubeも載せておきます。
<iframe width="400" height="400" src="https://www.youtube.com/embed/HT49wpyux-k" title="Lenia: Expanded Universe 1080p" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
動きや見た目がかかわいいですね。自分は120度の回転対称の形態をしているやつが好きです（この動画にないかも..）。

### Particle　Leniaってなに？？
今回実装したParticle Leniaは、ざっくり説明するとLeniaのメカニズムに影響を受けて作成された粒子系のシミュレーションです[2]。

1. 粒子の位置をもとに、特定の関数(Leniaで用いる関数とほぼ同じ)でエネルギーの場を表現する  
2. 粒子の位置をエネルギーの低い方向（安定する方向）に動かす  

をくりかえすことで、全体の挙動を計算しています。

粒子系でシミュレーションすることで、
- 質量が保存される（粒子の数を固定すると絶滅することはない）  
- 粒子に対して異なるパラメータを設定できる(異なる種を同じシミュレーションに共存させることが簡単にできる)

などのメリットがあり、Leniaより拡張性がありそなうな予感です。

[2]に載ってあるYoutubeを添付しておきます。
<iframe width="400" height="400" src="https://www.youtube.com/embed/AP3zeHyWakw" title="Particle Lenia" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
粒子の挙動に合わせて音までついていて、見ていて楽しいですね。

## 作って眺める
実際にパラメータを動かして挙動を確認してみたかったので、[2]を参考にParticle LeniaをUnity上で実装してみました。その際、[2]と同じになると面白くないので、Compute Shaderを用いて、GPUの力で大量の粒子をシミュレーションしてみました。具体的には、512x512のTexture上で5000個の粒子を用いて、シミュレーションしました。

下の動画が、複数のパラメータセットを切り替えながらシミュレーションを行ったものになります。  

<iframe width="400" height="400" src="https://www.youtube.com/embed/bfbeZTVEUEE" title="Particle Lenia Test" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>

[2]の動画にあるような、ダイナミックな移動を再現することはできませんでしたが（粒子の初期位置が重要そう..）、どことなく有機的なパターンを再現することができました。4つのパラメータしか変化させていませんが、こんなにも多様なパターンを作成できるのは興味深いですね。  

## 参考文献  
[1]:[Chan, B. W.-C. (2018). Lenia-biology of artificial life. arXiv preprint arXiv:1812.05433.](https://arxiv.org/abs/1812.05433)
[2]:[Mordvintsev, A., Niklasson, E., and Randazzo, E. (2022). Particle lenia and the energy-based formulation.](https://google-research.github.io/self-organising-systems/particle-lenia/)

### 終わりに
かなり雑な説明になりましたが、最先端のライフゲームの面白さや美しさを、少しでも共感できたなら幸せです。 

明日はkota miyakawaさんの"which-keyはいいぞ (デスクトップは燃えません)"という内容です。なんだか楽しそうですね。
最後に、アカツキゲームスでは一緒に働くエンジニアを募集しています。お気軽にご応募ください。[応募はここから](https://herp.careers/v1/aktskgames/requisition-groups/47f46396-e08a-4b2f-8f9b-b2fc79e63b83)