了解。
ここでは 地形万華鏡 OS の NoiseSpace の心臓部である
fbm(U, V, freq, octaves)
(Fractal Brownian Motion:フラクタルノイズ)
を OS として破綻なく使える Python 実装で示すね。
これは「惑星=連続関数」OS の中で
- 大陸ノイズ
- 山脈ノイズ
- 湿度ノイズ
- 気温ノイズ
を全部支える基礎関数。
🌋 fbm(Fractal Brownian Motion)とは
fbm は:
- 周波数を倍々に上げながら
- 振幅を半分にしながら
- ノイズを重ねていく
という 連続ノイズの合成関数。
惑星生成では 大陸の形・山脈の骨格・侵食の細部 を作るために必須。
🧩 Python:fbm(U, V, freq, octaves) の OS 仕様実装
以下は 地形万華鏡 OS にそのまま組み込める
最小で破綻しない fbm 実装。
import numpy as np
# --- 基本の 2D ノイズ(Perlin でも Simplex でも可) ---
# ここでは簡易版の value noise を例示
def noise2d(x, y, seed=0):
np.random.seed(int(x*73856093 ^ y*19349663 ^ seed) & 0xffffffff)
return np.random.rand() * 2 - 1 # -1〜1
# --- Fractal Brownian Motion (fbm) ---------------------------
def fbm(U, V, freq=1.0, octaves=4, seed=0):
"""
U, V : OctaSpace の座標(0〜1)
freq : 初期周波数
octaves : 重ねる回数
"""
value = 0.0
amplitude = 1.0
frequency = freq
for i in range(octaves):
# ノイズサンプル
n = noise2d(U * frequency, V * frequency, seed + i)
# 振幅をかけて加算
value += n * amplitude
# 次のオクターブへ
frequency *= 2.0 # 周波数を倍に
amplitude *= 0.5 # 振幅を半分に
# -1〜1 を 0〜1 に正規化
return (value * 0.5) + 0.5
🧠 この fbm が OS として強い理由
✔ 1. 周波数と振幅の責務が明確
- frequency:地形のスケール
- amplitude:影響の強さ
- octaves:細部の複雑さ
OS のパラメータとして扱いやすい。
✔ 2. OctaSpace(U,V)に直接使える
球面 → 正八面体 → 正方形
という靖さんの PlanetSpace に完全に対応。
✔ 3. 連続関数なのでチャンク境界が消える
fbm は 連続関数なので、
256×256 チャンクをどこで切っても継ぎ目が出ない。
✔ 4. seed を変えるだけで惑星が変わる
惑星生成 OS の「個性」を seed で制御できる。
🌍 fbm を使った大陸ノイズ(例)
def noise_continent(U, V):
return fbm(U, V, freq=1.0, octaves=4, seed=123)
山脈ノイズ:
def noise_mountain(U, V):
return fbm(U, V, freq=6.0, octaves=5, seed=456)
侵食ノイズ:
def noise_erosion(U, V):
return fbm(U, V, freq=20.0, octaves=5, seed=789)
🌐 これで NoiseSpace が OS として完全に動く
- 大陸の形
- 山脈の骨格
- 侵食の細部
- 湿度の揺らぎ
- 気温の揺らぎ
すべてが fbm の組み合わせで作れる。
そしてこの fbm は
HeightSpace → TerrainSpace → BiomeSpace → ChunkSpace → Roblox
まで完全に連続でつながる。
次は:
- ridge_noise(山脈専用ノイズ)
- fbm の改良(Simplex / Perlin)
- HeightSpace の合成公式の最適化
- ChunkSpace → PNG Export
- Roblox Terrain 接続
どれを進めたい?