いいね、その段階に来たかって感じがする。
「惑星=一枚の heightmap」じゃなくて、「惑星=パラメータ+チャンク生成アルゴリズム」として MySQL に刻むイメージで組んでみよう。
1. 惑星のデータモデル(MySQL スキーマの芯)
planets テーブル
- id: 惑星ID(PK)
- name: 惑星名
- seed: 乱数シード
- radius_km: 半径
- sea_level: 海面基準(標高のしきい値)
- axial_tilt: 地軸傾斜
- solar_intensity: 太陽光強度
- plate_activity: プレート活動度(地殻変動の荒さ)
- humidity_global: 全体湿度
- oxygen_level: 酸素量(植生進化度のベース)
- created_at / updated_at
planet_biomes テーブル
- id
- planet_id
- name: biome 名(tundra, desert, forest…)
- lat_min / lat_max: 緯度帯
- temp_min / temp_max
- humidity_min / humidity_max
- elevation_min / elevation_max
- vegetation_density
planet_chunks テーブル(必要ならキャッシュ用)
- id
- planet_id
- chunk_x / chunk_y: 惑星ローカルのチャンク座標
- heightmap_blob: 256×256 の heightmap(バイナリ)
- materialmap_blob: 256×256 の material(バイナリ)
- biomemap_blob: 256×256 の biome ID(バイナリ)
- generated_at
2. 惑星生成アルゴリズム(OS 側)
ステップ0:惑星レコードを作る
- seed を決める
- 惑星パラメータ(半径・海面・地軸・太陽光・プレート活動度など)を乱数+プリセットで決定
INSERT INTO planets ...
ここではまだチャンクは作らない。
「惑星=パラメータ空間」だけをまず確定する。
3. チャンク生成アルゴリズム(オンデマンド)
Roblox から
planet_id, chunk_x, chunk_y
が来たときに、OS 側でこう動くイメージ。
3.1 惑星パラメータ取得
SELECT * FROM planets WHERE id = planet_id- 必要なら
planet_biomesもロード
3.2 チャンク座標 → 惑星上の位置
-
惑星を equirectangular 的に 2D に展開して扱う前提で:
- チャンクサイズ:256×256
- 1ピクセル ≒ 1.2m とか 1.5m とか、ここは OS 側で決める
-
chunk_x, chunk_yとi, j (0..255)から
惑星上の「擬似緯度・経度」を計算
(本当に球面にしてもいいし、まずは平面近似でもいい)
3.3 ベース地形(heightmap)の生成
各ピクセル (i, j) について:
- プレートテクトニクス/大陸ノイズ
- 低周波のノイズ(例:Simplex / OpenSimplex)で大陸・海洋を決める
- 山岳・丘陵ノイズ
- 中〜高周波ノイズを重ねて標高を作る
- 海面レベルでクリップ
height < sea_level→ 海
- プレート活動度で荒さを調整
plate_activityが高いほど標高差を強くする
結果:
heightmap[256][256] が得られる。
4. 気候・バイオーム決定
各ピクセルごとに:
- 緯度から基礎温度を決定
- 地軸傾斜+太陽光強度から「緯度別平均温度」を計算
- 標高補正
- 高いほど寒く
- 湿度分布
humidity_globalをベースに、
ノイズ+海からの距離で湿度を決める
- biome 判定
planet_biomesの条件にマッチする biome を選ぶ- 例:
- 高温+乾燥 → desert
- 中温+湿潤 → forest
- 低温+中湿度 → tundra
結果:
biomemap[256][256] と materialmap[256][256] を生成。
5. チャンクの保存と返却
heightmap, materialmap, biomemapを
それぞれバイナリにエンコード(例:zlib 圧縮+自前ヘッダ)planet_chunksにINSERT(キャッシュ目的)- Roblox には JSON or バイナリレスポンスで返す:
{
"planet_id": 1,
"chunk_x": 10,
"chunk_y": 5,
"heightmap": "<base64>",
"materialmap": "<base64>",
"biomemap": "<base64>"
}
6. 「地形万華鏡 OS」としてのポイント
- 惑星は一度きり生成
→planetsにパラメータを保存した瞬間に「世界の法則」が固定される。 - チャンクはオンデマンド生成+キャッシュ
→ MySQL は「惑星の記憶」として機能する。 - Roblox は純粋な UI / 表示レイヤー
→ HttpService でチャンクを要求 → 展開 → 4チャンクで循環。
もし次の一手を選ぶなら:
- チャンク IR の具体的なバイナリフォーマット
- ノイズ関数のレイヤー構成(大陸/山岳/河川)
- biome 条件テーブルの設計
- 「空飛ぶ車」のパラメータを、この惑星モデルにどう結びつけるか
どこから OS を詰めていきたい?