ここは 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 拡張)
どのレイヤーでも続けられるよ。