ここは 地形万華鏡 OS の“惑星を本当に惑星として扱う”ための決定的なステップだね。
緯度経度ベースのチャンクは「地球型の固定座標」に縛られるけれど、
オクタヘドラル空間(OctaSpace)でタイルを切ると、
惑星は完全に ゲームエンジン的・数学的に均質な球体になる。
ここでは、OS として破綻しない 「OctaSpace タイル方式」 を定義する。
🌐 1. なぜチャンクを「オクタ空間」で切るのか
理由は 3 つある:
✔ 1. 緯度経度は極で縮退する(チャンクが潰れる)
- 緯度経度は極で「線が一点に収束」する
- チャンクが細長くなり、ノイズ周波数が狂う
- 河川・山脈が極で破綻する
✔ 2. オクタ空間は歪みが最小で均質
- 球面 → 正八面体 → 正方形
- 全域でほぼ均一な密度
- ノイズの周波数が一定
- チャンク境界が完全に連続
✔ 3. ゲームエンジン(UE5, Unity, GPU)と同じ方式
- AAA ゲームの惑星生成と同じ数学
- Roblox のチャンクにも相性が良い
- 将来 GPU 実装に移行しやすい
🧭 2. OctaSpace の座標系(OS の絶対基準)
オクタ空間は 1枚の正方形(U,V ∈ [0,1])。
(0,0) ───────────── (1,0)
│ │
│ Octahedral Map │
│ │
(0,1) ───────────── (1,1)
この正方形を Nx × Ny のタイルに分割する。
例:
- 4096×4096 の惑星ノイズ空間
- 256×256 のチャンク
→ 16×16 のタイル
🧩 3. チャンクを OctaSpace で切る方法
✔ タイル座標
tile_x ∈ [0, Nx-1]
tile_y ∈ [0, Ny-1]
✔ タイルの範囲(U,V)
U0 = tile_x / Nx
U1 = (tile_x + 1) / Nx
V0 = tile_y / Ny
V1 = (tile_y + 1) / Ny
✔ チャンク内のサンプリング
チャンクの i,j(0〜255)を U,V に変換:
u = U0 + (i / 255) * (U1 - U0)
v = V0 + (j / 255) * (V1 - V0)
✔ 方向ベクトルに戻す(Octa → Dir)
(前に定義した逆写像)
dir = octa_to_dir(u, v)
✔ height を取得
h = planet_height(dir)
これで チャンクは「惑星の連続関数の一部」になる。
🧪 4. Python コード(チャンクを OctaSpace で切る)
def sample_chunk_octa(tile_x, tile_y, Nx, Ny, res=256, seed=0):
chunk = [[0.0 for _ in range(res)] for _ in range(res)]
U0 = tile_x / Nx
U1 = (tile_x + 1) / Nx
V0 = tile_y / Ny
V1 = (tile_y + 1) / Ny
for j in range(res):
for i in range(res):
u = U0 + (i / (res - 1)) * (U1 - U0)
v = V0 + (j / (res - 1)) * (V1 - V0)
# Octa → 方向ベクトル
x, y, z = octa_to_dir(u, v)
# height 関数
h = planet_height_dir(x, y, z, seed=seed)
chunk[j][i] = h
return chunk
🌋 5. この方式が「惑星として破綻しない」理由
✔ 1. チャンク境界が完全に連続
→ どのチャンクも同じ連続関数をサンプリングしている
✔ 2. 極の縮退がゼロ
→ 緯度経度の欠点を完全に克服
✔ 3. ノイズ周波数が均一
→ 山脈・河川が惑星全域で自然に生成される
✔ 4. プレートテクトニクス・河川生成と相性が最高
→ ベクトル場が球面全域で安定する
✔ 5. Roblox の 256×256 チャンクにそのまま送れる
→ 地形万華鏡 OS の「惑星 → Roblox」パイプラインが完成
🌌 6. OS の惑星生成パイプライン(完成形)
方向ベクトル (x,y,z)
↓
OctaSpace (U,V)
↓
NoiseSpace(大陸・山脈・侵食)
↓
HeightSpace(0〜1)
↓
TerrainSpace(海/陸/山脈/河川)
↓
BiomeSpace(森林/砂漠/ツンドラ)
↓
ChunkSpace(256×256)
↓
Roblox Terrain
これが 地形万華鏡 OS の惑星生成エンジンの骨格。
🧭 次に深めるなら…
- OctaSpace → プレートテクトニクスのベクトル場をどう定義するか
- 河川を OctaSpace 上で「線」として抽出する方法
- Roblox に送るチャンク IR のバイナリフォーマット
- 惑星パラメータ(海面・軸傾斜・太陽強度)の OS 設計
どこに進めたい?