本文档详细解析 cgaprocessor.js 中 roofShed 函数的实现。该函数用于生成单坡屋顶(Shed Roof / 单坡棚顶)——只有一个坡面,一侧高一侧低的简单屋顶形式。
roofShed 是所有屋顶函数中最简单的一个。它不对几何体做复杂的三角网格重建,而是直接抬升现有顶点的 Y 坐标(高度),在原几何体上直接变形得到单坡效果。
function func_roofShed(processor, angle) { angle = angle || 30; var top = processor.top; var size = processor.size(); var h = Math.tan(THREE.Math.degToRad(angle)) * (size.z || size.x || 1); top.vertices.forEach(v => { v.y += (v.z - top.boundingBox.min.z) / (size.z || 1) * h; }); }
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
angle | Number | 30 | 屋顶坡度角(度) |
var h = Math.tan(THREE.Math.degToRad(angle)) * (size.z || size.x || 1);
计算单坡屋顶的总高度差:
size.zsize.z 无效,退而求其次取 size.xsize.z 被视为单坡屋顶的"进深"(坡面延伸方向的长度)。建筑 footprint 通常为水平面(XZ 平面),Z 轴对应建筑的纵深方向。
top.vertices.forEach(v => { v.y += (v.z - top.boundingBox.min.z) / (size.z || 1) * h; });
这是整个函数的核心逻辑,极为简洁:
h图:单坡屋顶截面。Z 坐标越大(越靠右),Y 方向抬升越多。
| 特性 | 说明 |
|---|---|
| 无新几何体创建 | 直接修改 processor.top.vertices,不创建新的 THREE.Geometry |
| 坡度方向固定沿 Z 轴 | 屋顶坡面始终沿 Z 方向倾斜,不受形状旋转影响 |
| 线性插值抬升 | 高度按 Z 坐标线性变化,坡面为平面 |
| 无悬挑支持 | 函数没有 overhang 参数,屋顶边缘与 footprint 对齐 |
computeFaceNormals(),修改后法线可能需要手动更新。
对每个顶点 v,修改后的高度为:
v.y' = v.y + tan(θ) × depth × (v.z - z_min) / depth = v.y + tan(θ) × (v.z - z_min)
化简后:
v.y' = v.y + tan(θ) × (v.z - z_min)
// 默认 30 度单坡屋顶 Roof --> roofShed() // 15 度缓坡单坡屋顶 Roof --> roofShed(15) // 典型用法:在 footprint 上先生成墙体,再应用单坡顶 Lot --> extrude(3) comp(f) { top: ShedRoof } ShedRoof --> roofShed(25)
| 对比项 | roofShed | roofGable |
|---|---|---|
| 坡面数量 | 1 个 | 2 个 |
| 几何操作 | 直接修改顶点 Y 值 | 重建完整三角网格 |
| 屋脊 | 无(一侧高、一侧低) | 有水平屋脊线 |
| 悬挑 | 不支持 | 支持 overhangX/Y |
| 适用场景 | 简易棚屋、车库、现代建筑 | 传统住宅、仓库 |
cgaprocessor.js 第 1159~1165 行源码分析。生成时间:2026-05-28。