Articles cc lab lab 数学的カオスを制御する ~ UnityとVFX Graphで挑むジェネラティブアートの世界

 
こんにちは、インタラクティブコミュニケーショングループの井上です。
昨今、デジタルインスタレーションや体験型コンテンツにおいて、ジェネラティブアート(Generative Art:以下GA) を用いた表現への関心が高まっています。私たちのチームでも要望があった際に柔軟に応えられるよう、社内検証を実施しました。本記事では、その検証プロセスと得られた知見をご紹介したいと思います。
検証の目的は、適切なプログラミング言語やフレームワークの調査に加え、工数とクオリティのバランス、そして実案件に投入する際の課題を具体的に洗い出すことです。

開発環境の選定からストレンジアトラクタの描画まで

 

ジェネラティブアートの定義と開発者の解釈

ジェネラティブアート(GA)とは、コンピュータのアルゴリズムによって生成されるアート作品の総称で、「計算性・自律性・ランダム性」を主な特徴とします。 リサーチを通じ、GAには有名な数式の活用や、計算によってはじめて可能になる有機的な表現といった「テーマ性」が重要であることが分かりました。コンピュータに描画を委ねつつ、そこにいかに数学的な秩序を組み込むかが、開発における重要なポイントとなります。

開発環境の徹底比較:Processing vs Unity

開発にあたり、GAで主流の「Processing」と、私たちが普段活用している「Unity」を比較検討しました。 Processingは環境構築が容易でコードもシンプルですが、実案件を見据えた3Dモデルの扱いや、将来的なVR/AR対応、モバイルビルドにおいて情報が少なく懸念がありました。よって将来の顧客要件への柔軟な対応力を重視し、Unityでの開発を決定しました。
また、UnityのGLクラスを用いた描画も検証しましたが、最適化されていないため大量の描画には負荷が大きく向かなかったため、図形の描画に頼らない方法を模索しました。

最適なテーマの選定:数理モデル「ストレンジアトラクタ」

技術検証として投入可能な工数が限られているので、テーマ選びには基準を設けました。

  1. 今回設定された期間・工数内で実装・完結できること
  2. 「技術の研鑽途中」と感じさせない、商用レベルの視覚効果(見栄え)が得られること
  3. 数学の力で幾何学的かつカオスな模様を生成できること

これらに合致したのが「ストレンジアトラクタ」です。これは特定の方程式(軌道を描く方程式)から得られる座標が、幾何学的かつカオスな挙動を示す現象を指します。方程式をアルゴリズムとしてコードに落とし込むことで、デザインの経験に頼らずとも、計算機ならではの緻密なアートワークを生成することが可能になります。

システム構成と技術実装のディテール

実装の核となるのは、C#での座標計算と、VFX Graphによる描画の切り分けです。

cclab_generativeart_image3

1. C#によるデータハンドリング

毎フレームごとにストレンジアトラクタの漸化式から次の座標を計算します。この際、100万点規模のデータを効率的に扱うため、NativeArrayを用いてメモリを管理し、GraphicsBuffer(StructuredBuffer)を介してGPUへ転送する構成としました。具体的には、以下のバッファを構築しています。

  • PositionBuffer:計算されたパーティクルの座標データ
  • ScaleBuffer:非表示にするパーティクルのスケールを制御するためのデータ
cclab_generativeart_image4

2. VFX Graphによるハイパフォーマンス描画

「曲線」のように見える描画の正体は、実は膨大な「点(パーティクル)」の集合です。これを滑らかに、かつインタラクティブに動かすには、GPU側での高速な並列処理が欠かせません。今回はVFX Graphを採用し、以下の最適化を施すことで、100万点以上の描画においてもPCへの負荷を最小限に抑えています。

  • MeshのQuad化:今回の計算結果は2次元座標として出力されるため、描画用Meshには最軽量なQuad(四角形ポリゴン)を設定しました 6。
  • ロジックの分離:VFX Graph側では複雑な計算を行わず、スクリプトから渡されたバッファ情報を反映させるだけの「最低限の構成」に徹することで、描画効率を極限まで高めています。

動的な変化と複数アトラクタの合成による表現の拡張

 

実行結果と描画負荷の最適化

開発環境の構築が終わったので、実際にネット上で公開されている数式IDを使って、Unity上で描画の検証を行いました。
ジェネラティブアートの密度は、描画するパーティクルの数に大きく関係します。検証してみると、パーティクルを増やすほど繊細で美しい模様になりますが、50万点を超えたあたりから見た目の違いは少なくなっていくことが分かりました。
また、100万点を超えると計算負荷が大きくなるため、実際の案件で使うことを考えると、「50万点から100万点」の間が、見た目と処理負荷のバランスが一番よい範囲だと思います。

動的な変化:時間軸でのアニメーション制御

cclab_generativeart_image7

静止した模様だけでなく、時間の経過とともに有機的に変化し続ける表現を実現するため、C#側で数式の係数を動的に書き換える仕組みを実装しました。
元の係数に対して一定の「ベクトル」と「スケーリング値」を設定し、毎フレーム加算していく方法です。

ただ、ここで技術的な問題が出てきました。ストレンジアトラクタは、係数が一定の範囲を超えて大きくなりすぎると、動きが止まったり、模様が消えてしまったりします。計算が発散・収束して、画面に何も映らなくなることもあります。
そこで、係数が一定の閾値を超えた場合は、ベクトルの加算を減算に切り替える「制御アルゴリズム」を組み込みました。これによって、模様が画面内に収まり、動き続けるようにしています。
さらに、定期的にベクトルの値をランダムに変更することで、同じ動きを繰り返すのではなく、常に新しい模様が現れるようにしました。

cclab_generativeart_image8

ストレンジアトラクタの種類と視覚的差異の考察

検証では、代表的な3つのアトラクタ方程式を使い、それぞれの見た目や動きの違いを比較しました。

  • de Jongアトラクタ:今回検証した中では最も安定していて、幾何学模様になりやすい特徴があります。視覚的には「もやが広がったような」柔らかい広がりを見せ、画面内に常に何らかの動きを出したい場合に向いています
  • Cliffordアトラクタ:de Jongと似た動きをしますが、より「曲線」の美しさが目立ちます。一方で、小さな点に収束している時間が比較的長いという特徴もありました。
  • Sprottアトラクタ:うまくいったときには、かなり特徴的でシャープな幾何学模様を描きます。ただ、ほかの方程式に比べて収束や拡散が起こりやすく、画面に何も映らない時間もかなり長くなりました。扱うのが難しい、ピーキーなアトラクタだと感じました。

 

応用:アトラクタの合成による表現の深化

単一の方程式だけでは作れない、より複雑でカオス的な表現を作るために、複数のアトラクタを組み合わせる方法も検証しました。座標計算に使う数式を交互に切り替えたり、ランダムに切り替えたりする実装です。例えば、de JongとCliffordを交互に使うことで、もやが広がったような幻想的な模様をベースに、さらに複雑な形状変化を作ることができます。
この方法の大きなメリットは、表現の幅が広がるだけではありません。「描画の維持確率」が上がるという点もあります。
単独の方程式では収束・拡散してしまう条件でも、別の方程式を間に入れることで、計算結果が画面内に戻ってくることがあります。そのため、より安定してアートワークを生成できることが分かりました。

 

考察:エンジニアが向き合う「アート」の課題と展望

今回のR&Dを通して、ジェネラティブアートを「商用レベル」にするための課題が見えてきました。
GAはアルゴリズムによって生成されますが、「アート」である以上、制作者のセンスや経験も重要になります。既存の数式を使うだけでなく、オリジナリティのある表現を作るには、「デザインを描ける能力」と「芸術的に見える数学の知識」の両方が必要となるでしょう。

今回の検証で得られた知見をベースに、今後はさらに外部デバイスとの連携や、インタラクティブな要素を追加することで、キャドセンターならではの付加価値の高いコンテンツ開発へと繋げていきたいと考えています。