距離場・暗黙形状

空間反復

Domain Repetition / Polar Repetition

座標を折り返して形を繰り返す。

6 / 10

インタラクティブデモ

デモを準備しています…

空間反復

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

ひとことで

距離場を評価する前に、座標を一定の間隔で折り返すことで、1 つの形を無限に並べる手法です。柱を 1 本定義するだけで地平線まで続く列柱になり、ビルを 1 棟定義するだけで街並みになります。形の数をいくら増やしても、1 点あたりの計算量はほとんど変わりません。角度で折り返せば、歯車の歯や花びらのように円周上にも並べられます。

ゲームでの使いどころ

  • 背景の大量の反復物:列柱、並木、柵、線路の枕木、街灯、SF 通路の肋骨状の構造。
  • プロシージャルな街・森:セル番号から高さや種類を変えて、変化のある街並みや森を作る。
  • 円周上の反復:歯車、タービン、花、魔法陣の装飾、回転するリング。
  • トンネル・無限回廊:奥へ無限に続く通路の演出(デモシーンの定番)。

しくみ

1 方向の反復:間隔 ss で xx を折り返し、どの点も「原点の近くの 1 セル」に写してから形を評価します。

c=round ⁣(xs),x′=x−s cc = \text{round}\!\left(\frac{x}{s}\right),\qquad x' = x - s\,c

cc はその点が属するセルの番号です。これをハッシュ関数に通すと、セルごとに高さ・太さ・色を変えられます。

2 方向(格子)の反復:xx と zz の両方を同じように折り返します。

極座標の反復:角度 θ\theta をセクターの幅 2π/n2\pi/n で折り返し、1 本の歯(1 枚の花びら)だけを定義します。

θ′=θ−2πn round ⁣(θ2π/n),p′=r (cos⁡θ′, sin⁡θ′)\theta' = \theta - \frac{2\pi}{n}\,\text{round}\!\left(\frac{\theta}{2\pi / n}\right),\qquad \mathbf{p}' = r\,(\cos\theta',\ \sin\theta')

極座標変換と同じ考え方で、模様ではなく立体を円周に並べています。

実装のポイント

  • abs による鏡像:abs(p.z) は反復の特別な場合で、形を左右対称に 2 つ並べます。
  • 有限個の反復:セル番号を clamp(round(x/s), -n, n) のように制限すると、決まった数だけ並べられます。
  • 色・材質もセル番号から:同じ形でも、セル番号から色や劣化具合を決めれば単調になりません。

つまずきやすい点

  • 隣のセルの形を見落とす:折り返しは「自分のセルの形しか見ない」ので、形がセルからはみ出したり、セルごとに大きさが違ったりすると、隣のセルの形のほうが近いのに気づけません。距離が過大になり、光線が形に突き刺さって破片のような誤りが出ます。デモの「隣のセルも調べる」をオフにすると確認できます。周囲のセル(3×3 など)も評価して最小値を取るのが対策です。
  • セル境界で形が切れる:形がセルの半分より大きいと、境界で切れて見えます。形をセルに収めるか、隣のセルも調べます。
  • 遠方のエイリアシング:無限に並べた細かい形は、遠くで画素より小さくなり、ちらつきやモアレが出ます。距離に応じてぼかしたり、霧で隠したりします。

デモで試すこと

  1. 「1 方向(列柱)」では、柱を 1 本定義しただけで地平線まで並んでいます。オレンジの柱が、式で定義した元の 1 本(セル番号 0)です。
  2. 「2 方向(ビル街)」で「隣のセルも調べる」をオフにすると、黒い破片のような誤りが出ます。オンに戻すと消えます。
  3. 「セルごとに変化を付ける」をオフにすると、すべて同じ形になり、反復していることがはっきり分かります。
  4. 「極座標(歯車)」では、スライダーで歯の数を変えても、定義しているのは歯 1 本だけです。

参考資料

Unreal Engine Mesh Distance Fields ↗

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