3次元ライフゲームをVRで楽しむ

  • このエントリーをはてなブックマークに追加

こんにちは。DVERSE Inc.の高田です。

みなさん、「ライフゲーム」をご存じですか?
もしご存じでなければ、PCブラウザから「ライフゲーム」をGoogle検索してください。

すると以下の画像のように、画面右上の背景で何やらモゾモゾ(?)と動いていると思いますが、それです。

ついでに、検索結果の1番上にでてくるWikipediaを開いて、説明を見てみるとよいでしょう。

ライフゲーム – Wikipedia

一番の肝は「ライフゲームのルール」です。

誕生
死んでいるセルに隣接する生きたセルがちょうど3つあれば、次の世代が誕生する。
生存
生きているセルに隣接する生きたセルが2つか3つならば、次の世代でも生存する。
過疎
生きているセルに隣接する生きたセルが1つ以下ならば、過疎により死滅する。
過密
生きているセルに隣接する生きたセルが4つ以上ならば、過密により死滅する。

つまり、一定のルールでセル(細胞)の生死をシミュレーションするものだと理解すればよいです。

ライフゲームで面白いのは、とても単純なルールであるにも関わらず、偶然によって発生するパターンでセルが芸術的ともいえる繁殖や移動、繰り返しの振動を行う、いわば「生命の営み」を見ることができることかと思います。
もし興味があるなら、いろいろな動画サイトで見てみてください。

ちなみに、DVERSE Inc.のロゴは、実はライフゲームで最も有名な移動物体パターンである「グライダー」が元になっています。

DVERSEのロゴはグライダーを立体化したものなんですが、その成り立ちはSketchUpで自作した3DモデルをSketchfabにアップロードしてありますので、以下からマウスで回転させたりして見てみてください。

前置きが長くなってしまいました。

一般的なライフゲームは、2次元空間において上記ルールを適用するものほとんどですが、今回は3次元空間で別のルールを用いたセルのシミュレーションを行い、VRでその様子を眺めてみようという記事になります。

開発環境と実行環境

  • Windows 64bit
  • Unity 5.4
  • HTC Vive(なくても可)

実は、今回のUnityプロジェクトは、2年前(2015年1月)にUnity 4.6辺りで、Oculus DK2向けに作ったものを、Unity5 / HTC Vive向けに移植したものです。

2年前の自分の未熟なコードを微笑ましく見つつ、HTC Viveのルームスケールおよびコントローラを有効に活用できるように改修しました。

機能概要

  • 2次元のライフゲームと、3次元のライフゲームの両方に対応する。
  • プレイヤーのスケールを変化させ、ミクロなライフゲーム世界やマクロなライフゲーム世界に没入できる。
  • ライフゲームの再生/停止/リセットが制御できる。
  • 独自のライフゲームのルールを設定できる。
  • VR HMDがなくてもマウスとキーボードでも使える。

が、2年前にやったことですが、これらに加えて以下に対応しました。

  • HTC ViveコントローラーでVR空間内に直接セルの追加や削除ができる。
  • ライフゲーム世界をX,Y,Z軸のそれぞれでループさせ、セルが無限に移動できる。

以下、主にライフゲームのアルゴリズムについて、コードを抜粋しながら説明します。
プログラミングに興味がない方は、記事末尾のプレイ動画に飛んでください。

ソースコード(C#)の抜粋

基本的なアルゴリズムおよびデータ構造はものすごく単純で、3次元の配列を2つ用意しておいて、現行世代と次世代を交互に入れ替えながらセルの生死のシミュレーションを行います。
2次元のライフゲームは、X,Y,Z軸のどれか1つの長さが1の特別な3次元配列と考えることで、アルゴリズムの共通化を図っています。

シミュレーション用の3次元配列の他に、Unityシーンに表示するGameObjectを格納する3次元配列も用意しています。
また、Unityシーンでセルを表現するプレハブ(objectPrefab)を指定することが可能で、簡単に「ガワ替え」のコンテンツが制作できるようになっています。

細かな工夫として、毎回すべての3次元配列の要素について計算しなくて済むように、現在生存しているセルの各配列インデックスの最小値と最大値も持つようにしています。

Unityのコルーチン機能を用いてループし、インターバル時間毎に次世代の計算をしています。

次世代の計算はおおよそ以下のとおりです。

メソッドの中では、計算対象の全てのセルについて、隣接する26個のセルの中で、生きているセルの数が何個あるかで、当該セルの次世代の生死を決定しています。

3次元空間でのセルの位置関係は、以下のSketchUpモデルを見ればわかりやすいかと思います。

次のメソッドがライフゲームで一番大事ともいえる部分で、隣接する26個のセルの中で、生きているものの個数を数えます。

なお、今回のプログラムがデフォルトで採用しているルールは以下です。

誕生の条件 生存の条件
2次元ライフゲーム 隣接する生きたセルが3個 隣接する生きたセルが2個または3個
3次元ライフゲーム 隣接する生きたセルが5個 隣接する生きたセルが5個または6個

もちろん、上記以外のルールでも2次元および3次元のライフゲームは成立します。
興味がある方は、記事の下の方の参考文献を参照してみてください。

また、今回の記事で配布しているプログラムでは、画面のUIから独自のルールを設定できますので、みなさんで3Dライフゲームに最適なルールを追及してみてください。

セルの配列インデックスとオブジェクトのワールド座標の相互変換は以下のとおり。

VRコントローラーでの使い勝手のため、いったんUnityのBounds構造体に変換し、ClosestPoint()メソッドを取得することで、ある程度近づいた位置でもセルを指定できるようにしています。

Unityシーンに対するオブジェクト(セル)の生成(誕生)および破棄(死滅)のコードは以下のとおり。

VRコントローラの操作に関してはソースコードが長くなってしまうので省略しますが、コントローラのワールド座標をWorldPointToCell()で配列インデックスに変換した上で、NewObject()およびDestroyObject()を呼び出しています。

以上、部分的なコードかつ説明も不足気味で申し訳ないのですが、ライフゲームのコア部分のアルゴリズムに関する説明でした。

プレイ動画

実際にプレイしている様子は以下の動画をご覧ください。

プログラムの配布

Unityでビルドしたバイナリファイル(Windows 64bit)を配布いたします。

Game of Life VR(Ver. 01a)

※動作を保証するものではありません。万が一、誤動作によって損害が発生したとしても、当方は一切の責任を負うものではありません。

※HTC Viveがなくても動作するようにしていますが、GPU性能が良いPCを利用するのがベターです。

※BGMや効果音は、以下のサイトの音声ファイルを利用させていただいております。
TAM Music Factory

参考文献

ライフゲームについて詳しく知りたい方は、以下の文献を読んでみてください。

A New Candidate Rule for the Game of To-dimensional Life

Candidates for the Game of Life in Three Dimensions

A Note About the Discovery of Many New Rules for the Game of Three-Dimensional Life

最後に

本当は3Dライフゲームの方の、生き物っぽくにウネウネ(?)動くセルの描画用に自作したシェーダー等も紹介したかったのですが、それはまたの機会にしたいと思います。

それでは今回はこれで失礼いたします。

Let’s Enjoy “VR” Programming!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。