自動生成・配置ルール

空間占有法

Space Colonization Algorithm

誘引点へ枝を伸ばして樹木や葉脈を作る。

3 / 10

インタラクティブデモ

デモを準備しています…

空間占有法

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

木を育てたい空間に誘引点(葉の芽の候補)をばらまき、枝の先が近くの誘引点の方向へ少しずつ伸びていくことをくり返して、枝分かれの形を作る方法です(Runions ほか、2007 年)。枝どうしが誘引点を奪い合うので、枝が重ならずに空間を自然に埋めます。誘引点を置く範囲を変えるだけで、丸い樹冠の広葉樹、とがった針葉樹、葉脈、根、血管のような形を作り分けられます。

ゲームでの使いどころ

  • 木の生成:樹冠の形(球、円錐、傘)を決めて誘引点をばらまくと、その形を自然に埋める枝ができる。建物のそばでは誘引点を置かなければ、枝が壁を避ける。
  • 葉脈・根・血管:平たい葉の形や地中に誘引点を置いて、葉脈や根を作る。
  • つる・苔・菌糸:壁や岩の表面に誘引点を置き、這うように広がる植物を作る。
  • 稲妻・亀裂・川の流域:誘引点を目的地の方向に置いて、枝分かれしながら伸びる形を作る。

しくみ

誘引点の集合 AA と、枝の節の集合 NN(最初は根元の 1 点)を持ち、次をくり返します。

  1. 引き寄せ:各誘引点 aa について、引き寄せる距離 did_i の中で一番近い節 nn を 1 つだけ選びます。
  2. 成長:誘引点に選ばれた節は、選んだ誘引点への向きの平均の方向へ、長さ DD の新しい節を伸ばします。
v=∑a∈S(n)a−n∥a−n∥,n′=n+D v∥v∥\mathbf{v} = \sum_{a \in S(n)} \frac{a - n}{\|a - n\|}, \qquad n' = n + D\,\frac{\mathbf{v}}{\|\mathbf{v}\|}
  1. 消去:どれかの節から消える距離 dkd_k より近くなった誘引点は、役目を終えたので取り除きます。
  2. 誘引点がなくなるか、どの節も伸びなくなったら終わりです。

枝の太さ:枝先を細い基本の太さにし、根元へ向かって子の枝の太さを「rnr^{n} の和」で合わせていきます(パイプモデル、nn は 2〜3)。枝分かれのたびに少しずつ太くなり、幹が一番太い、自然な太さの変化になります。

r親 n=∑r子 nr_{\text{親}}^{\,n} = \sum r_{\text{子}}^{\,n}

実装のポイント

  • 近くの節だけ調べる:誘引点ごとに全部の節と距離を比べると遅いので、節を空間ハッシュ(格子)に入れ、周りのマスの節だけを調べます。
  • 3 つの距離の関係:引き寄せる距離 did_i を大きくすると枝が少なく長くなり、消える距離 dkd_k を大きくすると枝がまばらになります。伸びる長さ DD は dkd_k より十分小さくします。
  • 幹を先に伸ばす:根元が誘引点から遠いと、最初は何も伸びません。誘引点に届くまで、幹をまっすぐ上に伸ばしておきます。
  • メッシュ化:節と太さが決まれば、円柱をつなぐかスイープで枝のメッシュを作り、枝先に葉のカードを付けます。

つまずきやすい点

  • 行ったり来たりして止まらない:1 つの節が、反対側の誘引点に同時に引っぱられると、向きの平均がほぼ 0 になって同じ所を伸び続けます。残りの誘引点が減らなくなったら打ち切ります。
  • 枝がまっすぐすぎる:誘引点が均一すぎると、枝も規則的になります。誘引点の密度にむらを持たせたり、重力の向きの成分を加えたりすると自然になります。
  • 計算量:誘引点や節が数万になると重くなります。ゲームでは事前に作ってメッシュとして保存するのが普通です。

デモで試すこと

  1. 黄色い誘引点に向かって枝が伸び、枝が近づいた誘引点が消えていきます。完成すると枝先に葉が付き、根元ほど太い木になります。
  2. 「誘引点の範囲」を「針葉樹」「葉脈」に切り替えると、同じ規則のまま、範囲の形に合わせた枝ぶりになります。
  3. 「引き寄せる距離」を小さくすると、枝が細かく分かれて密になり、大きくすると、太い枝が少なくなります。
  4. 「消える距離」を大きくすると、枝先がまばらになり、枝の数が減ります。

参考資料

WaveFunctionCollapse ↗

分野全体の資料で、この項目を直接扱っているとは限りません。