roofShed 函数实现详解

本文档详细解析 cgaprocessor.jsroofShed 函数的实现。该函数用于生成单坡屋顶(Shed Roof / 单坡棚顶)——只有一个坡面,一侧高一侧低的简单屋顶形式。

一、函数定位

roofShed 是所有屋顶函数中最简单的一个。它不对几何体做复杂的三角网格重建,而是直接抬升现有顶点的 Y 坐标(高度),在原几何体上直接变形得到单坡效果。

二、源码实现(第 1159~1165 行)

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; });
}

三、参数说明

参数类型默认值说明
angleNumber30屋顶坡度角(度)

四、算法步骤详解

Step 1: 计算屋顶高度差

var h = Math.tan(THREE.Math.degToRad(angle)) * (size.z || size.x || 1);

计算单坡屋顶的总高度差

注意:此处的 size.z 被视为单坡屋顶的"进深"(坡面延伸方向的长度)。建筑 footprint 通常为水平面(XZ 平面),Z 轴对应建筑的纵深方向。

Step 2: 按 Z 坐标比例抬升顶点

top.vertices.forEach(v => { v.y += (v.z - top.boundingBox.min.z) / (size.z || 1) * h; });

这是整个函数的核心逻辑,极为简洁:

  1. 对每个顶点,计算其在 Z 方向上的相对位置比例ratio = (v.z - z_min) / depth
  2. 将该比例乘以总高度差 h
  3. 将结果叠加到顶点的 Y 坐标上
h θ Z 方向(进深 depth) 低侧 高侧 y += ratio × h

图:单坡屋顶截面。Z 坐标越大(越靠右),Y 方向抬升越多。

五、关键特性

特性说明
无新几何体创建直接修改 processor.top.vertices,不创建新的 THREE.Geometry
坡度方向固定沿 Z 轴屋顶坡面始终沿 Z 方向倾斜,不受形状旋转影响
线性插值抬升高度按 Z 坐标线性变化,坡面为平面
无悬挑支持函数没有 overhang 参数,屋顶边缘与 footprint 对齐
注意:由于该函数直接修改现有顶点而不重建面片,如果原始 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)

八、与 roofGable 的对比

对比项roofShedroofGable
坡面数量1 个2 个
几何操作直接修改顶点 Y 值重建完整三角网格
屋脊无(一侧高、一侧低)有水平屋脊线
悬挑不支持支持 overhangX/Y
适用场景简易棚屋、车库、现代建筑传统住宅、仓库
文档生成信息:基于 cgaprocessor.js 第 1159~1165 行源码分析。生成时间:2026-05-28。