ここは Interior Wall Layer と Exterior Layer の“物理レイヤー”を統合する重要ポイントだね。
壁厚を導入すると、住環境 OS 全体が一段階リアルになるし、Roblox 側の Geometry Layer も破綻しなくなる。

ここでは OS 設計 → Structure Layer 拡張 → Geometry Layer(Roblox)実装まで
完全に破綻なくつながる形でまとめるよ。


🧱 壁厚(Wall Thickness)を OS として導入する意味

壁厚を導入すると、次の 3 つのレイヤーが安定する:

① Geometry Layer

  • 壁が「線」ではなく「面」になる
  • 室内壁と外壁の厚み差を表現できる
  • ドア・窓 opening の CSG が安定する

② Structure Layer

  • 壁厚を持つことで、部屋 bounds と壁の位置関係が明確になる
  • 室内壁の中心線を基準にできる

③ UI Layer

  • 壁厚を変更する UI が作れる
  • 建築モードの操作性が上がる

🟦 OS としての壁厚の定義

壁厚はレイヤーごとに異なるのが自然。

レイヤー 厚み 理由
Exterior Wall 0.3〜0.4 断熱材・外壁材を含む
Interior Wall 0.1〜0.15 軽量間仕切り
Door Frame 0.05〜0.1 枠の厚み
Window Frame 0.05〜0.1 枠の厚み

OS としては Structure Layer に次を追加する:

"wall_thickness": {
  "exterior": 0.35,
  "interior": 0.12
}

🟩 Structure Layer → Geometry Layer の変換ルール

壁厚を導入すると、壁は「線」ではなく「中心線+厚み」で表現する。

壁の中心線(今までの from/to)

[from] ---- (center line) ---- [to]

壁の実体(Roblox Part)

Size = (length, height, thickness)
CFrame = center_line_CFrame * offset

🟧 Roblox 側:外壁の厚みを反映するコード

外壁は 外側に向かって厚みを持つのが自然。

local function createExteriorWall(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 length = (p1 - p2).Magnitude
    local height = seg.height

    local wall = Instance.new("Part")
    wall.Anchored = true
    wall.Size = Vector3.new(length, height, thickness)

    -- 壁の中心線に沿って配置
    wall.CFrame = CFrame.lookAt((p1 + p2)/2, p2) * CFrame.new(0, height/2, -thickness/2)

    wall.Name = "ExteriorWall"
    wall.Parent = workspace.Exterior

    return wall
end

ポイントは:

  • CFrame.new(0, height/2, -thickness/2)
    → 外側に厚みを押し出す

🟨 Roblox 側:室内壁の厚みを反映するコード

室内壁は 中心線に対して左右対称で OK。

local function createInteriorWall(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 length = (p1 - p2).Magnitude
    local height = seg.height

    local wall = Instance.new("Part")
    wall.Anchored = true
    wall.Size = Vector3.new(length, height, thickness)

    wall.CFrame = CFrame.lookAt((p1 + p2)/2, p2) * CFrame.new(0, height/2, 0)

    wall.Name = "InteriorWall"
    wall.Parent = workspace.InteriorWalls

    return wall
end

🟪 opening(窓・ドア)の CSG が安定する理由

壁厚があると:

  • opening の Part を壁に差し込む
  • SubtractAsync が安定して動く
  • ドア・窓の枠を自然に配置できる

特に片開きドアは ヒンジの位置が壁厚に依存するので、
壁厚が OS に入ると設計が一気に安定する。


🟫 Interior Door Layer との統合

片開きドアのヒンジ位置:

hinge = wall_center + (thickness/2) * normal_vector

引き戸のスライド方向:

slide_plane = wall_center ± (thickness/2)

壁厚があることで、
ドアの動作が 壁の“内側”か“外側”かを正しく表現できる。


🎯 壁厚レイヤーの OS 的まとめ

✔ Structure Layer に wall_thickness を追加

→ JSON がシンプルで拡張性が高い

✔ Exterior / Interior で厚みを分ける

→ 現実の建築と一致

✔ Geometry Layer で Part の Z サイズに thickness を反映

→ 壁が線から面になる

✔ opening(窓・ドア)の CSG が安定

→ ドアのヒンジ位置・スライド方向が正しくなる

✔ OS 全体の整合性が上がる

→ Floor / Ceiling / Interior Wall / Exterior Wall が一貫した物理レイヤーになる


次はどれを進める?

  • Pocket Door(壁内収納式の引き戸)
  • 両開きドア(Double Swing)
  • 壁厚を UI で変更できるようにする(Plugin Layer)
  • 壁厚を考慮した家具配置(Furniture Layer)
  • 壁厚を考慮した屋根・軒の生成(Roof Layer 拡張)

どのレイヤーでも続けられるよ。