ここは Roof Layer の中でも“物理レイヤー”と“外観レイヤー”が交差する最重要ポイントだね。
壁厚を導入した瞬間、屋根と軒(eaves)の扱いが一気にリアルになる。
そして、住環境 OS として破綻しないためには 外壁の中心線ではなく“外壁の外側ライン”を基準に屋根を生成する必要がある。
ここでは、OS 設計 → Geometry → Roblox 実装まで
完全に一貫した形でまとめるよ。
🏠 Roof Layer 拡張:壁厚を考慮した屋根・軒の生成
🎯 結論(OS 的に最も正しい原則)
屋根は「外壁の外側ライン(outer outline)」を基準に生成する。
そして軒(eaves)は:
- 外壁の外側ラインをさらに外側にオフセットしたライン
- そのラインを屋根の投影面として使う
という二段階構造が最も破綻しない。
🟦 1. 外壁の中心線 → 外側ラインへの変換
外壁は Structure Layer では「中心線」で定義されている:
[from] ---- center line ---- [to]
壁厚(exterior_thickness)があるので、
屋根の基準となるのは 外側のエッジ。
外側ラインの計算
外壁セグメントの法線ベクトルを求めて:
outer_from = from + normal * (exterior_thickness / 2)
outer_to = to + normal * (exterior_thickness / 2)
これで 外壁の外側ポリゴン(outer_outline) が得られる。
🟩 2. 軒(eaves)の生成:外側ラインをさらに外へオフセット
軒の出幅(eaves_length)を Structure Layer に追加:
"roof": {
"type": "gable",
"eaves": 0.4
}
外側ラインをさらに外へオフセット:
eaves_from = outer_from + normal * eaves_length
eaves_to = outer_to + normal * eaves_length
これで 屋根の投影ポリゴン(roof_outline) が完成する。
🟧 3. Flat / Shed / Gable すべて roof_outline を使う
Flat Roof
roof_outline のバウンディングボックスを使う。
Shed Roof
roof_outline を傾ける。
Gable Roof
roof_outline の長辺を探して棟(ridge)を生成する。
🟥 4. Roblox 実装:壁厚+軒を考慮した屋根生成コード
Roblox 側で使うのは roof_outline(軒を含む外側ライン)。
✔ 外側ラインの生成(Lua)
local function offsetWallSegment(seg, thickness)
local p1 = Vector3.new(seg.from[1], 0, seg.from[2])
local p2 = Vector3.new(seg.to[1], 0, seg.to[2])
local dir = (p2 - p1).Unit
local normal = Vector3.new(-dir.Z, 0, dir.X) -- 左法線
local offset = normal * (thickness / 2)
return {
from = {p1.X + offset.X, p1.Z + offset.Z},
to = {p2.X + offset.X, p2.Z + offset.Z}
}
end
✔ 軒の生成(Lua)
local function addEaves(seg, eaves)
local p1 = Vector3.new(seg.from[1], 0, seg.from[2])
local p2 = Vector3.new(seg.to[1], 0, seg.to[2])
local dir = (p2 - p1).Unit
local normal = Vector3.new(-dir.Z, 0, dir.X)
local offset = normal * eaves
return {
from = {p1.X + offset.X, p1.Z + offset.Z},
to = {p2.X + offset.X, p2.Z + offset.Z}
}
end
✔ 最終 roof_outline の生成
local function buildRoofOutline(exteriorWalls, thickness, eaves)
local outer = {}
local roof = {}
for _, seg in ipairs(exteriorWalls) do
local o = offsetWallSegment(seg, thickness)
table.insert(outer, o)
local r = addEaves(o, eaves)
table.insert(roof, r)
end
return roof
end
🟦 5. Roof Builder に統合
local roof_outline = buildRoofOutline(
exterior.walls,
wall_thickness.exterior,
roof.eaves
)
RoofBuilder.BuildRoof(roof_outline, ...)
🎯 壁厚を考慮した屋根・軒の OS 的メリット
✔ 外壁と屋根の整合性が完全に取れる
→ 壁厚が変わっても屋根がズレない
→ 軒の出幅が正確に反映される
✔ Structure Layer → Exterior Layer → Roof Layer の流れが自然
→ 内部構造の変更が屋根に自動反映される
✔ Roblox Geometry が破綻しない
→ 壁厚を考慮した CFrame が正しくなる
→ 屋根が壁にめり込まない
✔ 軒の表現がリアルになる
→ 住宅としての外観が一気に本物になる
🌿 次に進める方向を提案するね
- Gable Roof の ridge line(棟)の完全自動生成
- 屋根材(Roof Material Layer)
- 軒天(soffit)と破風板(fascia)の生成
- 雨樋(gutter)レイヤー
- 屋根裏(attic)レイヤー
- Roblox Plugin 化(GUI で屋根タイプ・軒出幅を選択)
どのレイヤーから深めるのが、あなたの OS に一番しっくりくる?