ここは 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 に一番しっくりくる?