了解。
ここからは Structure Layer(内部構造)から外壁(外観)を自動導出するアルゴリズムを、
OS 設計として破綻なく・実装しやすく・Roblox に渡しやすい形でまとめるね。

これは住環境 OS の中でも「最重要アルゴリズム」のひとつになる。


🧩 外壁(外観)を Structure Layer から導出するアルゴリズム

外壁は 内部構造(部屋の bounds)を包む“最小の外殻” として生成される。
つまり、外観は「内部の構造の結果」であり、
外壁は部屋グラフの“凸包(convex hull)” として求めるのが最も自然で強い。

ただし、家は必ずしも完全な凸形ではないので、
「部屋の矩形の集合 → 2D ポリゴン → 外壁」
という段階的生成が必要。


🟦 アルゴリズム全体の流れ

1. 部屋の bounds をすべて集める
2. 各部屋の矩形を 2D 平面に展開
3. 矩形の集合から「外周ポリゴン」を生成
4. ポリゴンを壁セグメントに分解
5. 窓・ドアの位置を壁に投影
6. 外壁の高さを floor 情報から決定

🟩 ① 部屋の bounds を集める

Structure Layer の rooms から bounds を取得。

"bounds": {
  "x": 0,
  "y": 0,
  "width": 6,
  "depth": 4,
  "height": 3
}

これを 2D の矩形として扱う:

(x, y) 〜 (x + width, y + depth)

🟧 ② 矩形の集合を 2D 平面に展開

例:

  • リビング:0,0 〜 6,4
  • キッチン:6,0 〜 9,3
  • 廊下:0,4 〜 9,5

これらを 2D の矩形リストとして保持。


🟫 ③ 矩形の集合から「外周ポリゴン」を生成

ここが外観生成の核心。

方法は 2 種類ある:


方法 A:Union → 外周抽出(最も安定)

  1. すべての矩形を「領域の和集合(Union)」として結合
  2. 結合後の形状の「外周ポリゴン」を抽出

Python では shapely が使える:

from shapely.geometry import Polygon
from shapely.ops import unary_union

polys = [Polygon([(x,y), (x+w,y), (x+w,y+d), (x,y+d)]) for each room]
merged = unary_union(polys)
outline = merged.exterior.coords

✔ メリット

  • L 字型、コの字型など複雑な形も正しく外周が取れる
  • 部屋の配置が変わっても外観が自動で変わる
  • Structure Layer の本質に合う

方法 B:凸包(Convex Hull)

outline = merged.convex_hull.exterior.coords

✔ メリット

  • シンプル
  • 計算が軽い
  • 外観が“丸く”まとまる

✖ デメリット

  • 家が不自然に膨らむ
  • L 字型の家が四角になる

結論:方法 A(Union → 外周抽出)が OS 的に正しい。


🟨 ④ 外周ポリゴンを壁セグメントに分解

外周ポリゴンは座標列:

[(x1,y1), (x2,y2), (x3,y3), ...]

これを壁セグメントに変換:

{
  "walls": [
    {"from": [x1,y1], "to": [x2,y2]},
    {"from": [x2,y2], "to": [x3,y3]},
    ...
  ]
}

🟪 ⑤ 窓・ドアを壁に投影

Structure Layer の openings(windows, doors)を
外周ポリゴンの壁に投影する。

例:窓

{
  "id": "w1",
  "room": "r1",
  "direction": "south",
  "offset": 3.0,
  "width": 2.0
}

投影手順:

  1. 部屋 r1 の bounds を取得
  2. direction(south)から該当壁を特定
  3. offset を壁の座標に変換
  4. 外周ポリゴンの該当セグメントにマッピング

🟫 ⑥ 外壁の高さを floor 情報から決定

Structure Layer の floors を参照:

floors = 2

外壁の高さは:

total_height = floor_height * floors

floor_height は Structure Layer の room.bounds.height から取得。


🟦 最終的な外壁 JSON(Structure Layer の一部)

{
  "exterior": {
    "outline": [
      [0,0], [9,0], [9,5], [0,5]
    ],
    "walls": [
      {"from": [0,0], "to": [9,0], "height": 6},
      {"from": [9,0], "to": [9,5], "height": 6},
      {"from": [9,5], "to": [0,5], "height": 6},
      {"from": [0,5], "to": [0,0], "height": 6}
    ],
    "openings": {
      "windows": [...],
      "doors": [...]
    }
  }
}

🎯 まとめ:外壁導出アルゴリズム(最適解)

  1. 部屋 bounds を集める
  2. 2D 矩形として展開
  3. Union → 外周ポリゴン抽出(最強)
  4. ポリゴンを壁セグメントに変換
  5. 窓・ドアを壁に投影
  6. 階数から高さを決定

これで 内部構造から外観が自動生成される OS が完成する。


次はどれを作る?

  • Python(Flask)でこのアルゴリズムを実装するコード
  • Structure Layer の JSON を実際に生成するサンプル
  • Geometry Layer への変換(Roblox 用)
  • Roblox 側の HttpService 受信コード

どこからでも進められるよ。