了解。
ここからは 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 → 外周抽出(最も安定)
- すべての矩形を「領域の和集合(Union)」として結合
- 結合後の形状の「外周ポリゴン」を抽出
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
}
投影手順:
- 部屋 r1 の bounds を取得
- direction(south)から該当壁を特定
- offset を壁の座標に変換
- 外周ポリゴンの該当セグメントにマッピング
🟫 ⑥ 外壁の高さを 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": [...]
}
}
}
🎯 まとめ:外壁導出アルゴリズム(最適解)
- 部屋 bounds を集める
- 2D 矩形として展開
- Union → 外周ポリゴン抽出(最強)
- ポリゴンを壁セグメントに変換
- 窓・ドアを壁に投影
- 階数から高さを決定
これで 内部構造から外観が自動生成される OS が完成する。
次はどれを作る?
- Python(Flask)でこのアルゴリズムを実装するコード
- Structure Layer の JSON を実際に生成するサンプル
- Geometry Layer への変換(Roblox 用)
- Roblox 側の HttpService 受信コード
どこからでも進められるよ。