This explanation is currently available in Japanese.
ひとことで
距離場を評価する前に、座標を一定の間隔で折り返すことで、1 つの形を無限に並べる手法です。柱を 1 本定義するだけで地平線まで続く列柱になり、ビルを 1 棟定義するだけで街並みになります。形の数をいくら増やしても、1 点あたりの計算量はほとんど変わりません。角度で折り返せば、歯車の歯や花びらのように円周上にも並べられます。
ゲームでの使いどころ
- 背景の大量の反復物:列柱、並木、柵、線路の枕木、街灯、SF 通路の肋骨状の構造。
- プロシージャルな街・森:セル番号から高さや種類を変えて、変化のある街並みや森を作る。
- 円周上の反復:歯車、タービン、花、魔法陣の装飾、回転するリング。
- トンネル・無限回廊:奥へ無限に続く通路の演出(デモシーンの定番)。
しくみ
1 方向の反復:間隔 で を折り返し、どの点も「原点の近くの 1 セル」に写してから形を評価します。
はその点が属するセルの番号です。これをハッシュ関数に通すと、セルごとに高さ・太さ・色を変えられます。
2 方向(格子)の反復: と の両方を同じように折り返します。
極座標の反復:角度 をセクターの幅 で折り返し、1 本の歯(1 枚の花びら)だけを定義します。
極座標変換と同じ考え方で、模様ではなく立体を円周に並べています。
実装のポイント
- abs による鏡像:
abs(p.z)は反復の特別な場合で、形を左右対称に 2 つ並べます。 - 有限個の反復:セル番号を
clamp(round(x/s), -n, n)のように制限すると、決まった数だけ並べられます。 - 色・材質もセル番号から:同じ形でも、セル番号から色や劣化具合を決めれば単調になりません。
つまずきやすい点
- 隣のセルの形を見落とす:折り返しは「自分のセルの形しか見ない」ので、形がセルからはみ出したり、セルごとに大きさが違ったりすると、隣のセルの形のほうが近いのに気づけません。距離が過大になり、光線が形に突き刺さって破片のような誤りが出ます。デモの「隣のセルも調べる」をオフにすると確認できます。周囲のセル(3×3 など)も評価して最小値を取るのが対策です。
- セル境界で形が切れる:形がセルの半分より大きいと、境界で切れて見えます。形をセルに収めるか、隣のセルも調べます。
- 遠方のエイリアシング:無限に並べた細かい形は、遠くで画素より小さくなり、ちらつきやモアレが出ます。距離に応じてぼかしたり、霧で隠したりします。
デモで試すこと
- 「1 方向(列柱)」では、柱を 1 本定義しただけで地平線まで並んでいます。オレンジの柱が、式で定義した元の 1 本(セル番号 0)です。
- 「2 方向(ビル街)」で「隣のセルも調べる」をオフにすると、黒い破片のような誤りが出ます。オンに戻すと消えます。
- 「セルごとに変化を付ける」をオフにすると、すべて同じ形になり、反復していることがはっきり分かります。
- 「極座標(歯車)」では、スライダーで歯の数を変えても、定義しているのは歯 1 本だけです。