feat(renderer/roofs): 还原原版暗黑2建筑/城门屋顶与过道拱梁遮挡消失机制(修复哈洛加斯等城门盲区) #72

Closed
opened 2026-09-18 01:22:08 +00:00 by troytt · 0 comments
Owner

1. 现象描述与现场定位

在第五幕哈洛加斯(Harrogath)城门西出口(连接血腥丘陵 Bloody Foothills,townWest.ds1)处:

  • 玩家位置:哈洛加斯西城门门洞正前方地面(网格坐标约 cellX = 7..8, cellY = 30)。
  • 当前表现:城门上方的箭楼拱桥、过道城垛及左侧祭坛屋顶完全不透明(alpha = 1.0),未发生任何衰减或消失,严重阻挡门洞及后方视野。
  • 原版行为(Ground Truth):在原版暗黑破坏神2中,当角色走到城门拱门下方或门楼近前方时,整个门楼上方的遮挡层(包括屋顶与上层廊桥跨梁)会自动完全消失(alpha = 0.0),让玩家能够清晰看到门洞内部、穿行动线以及后方地形。

2. 根因技术剖析(Root Cause Analysis)

审计当前 src/render/roofs.ts 与 src/game/d2map.ts,存在以下 4 处深层缺陷:

缺陷一:等轴测投影高度位移导致 2D Bounding Box 碰撞脱节

  • 屋顶瓦片在世界空间的高度为 roofHeight(哈洛加斯城门屋顶 roofHeight = 160 像素)。
  • 在 d2map.ts 中,屋顶贴图坐标被向上平移:y = orthoY - tile.roofHeight。
  • 当前 isPlayerOverlappingRoofBounds 采用屏幕像素级 2D AABB 判定。当玩家站在地面(y ~ 1480)时,高空的屋顶贴图 AABB(y ~ 1200)在 Y 轴上与地面角色框完全错开,导致 AABB 判定恒为 false。

缺陷二:城门过道间隙导致聚类断裂(Clustering Disconnection)

  • 当前 clusterRoofs 算法基于 clusterCellDistance = 2 进行图连通分支聚类。
  • 哈洛加斯西城门中间通道宽度达到 3~4 个 cell(cellX = 7..10):
    • 左侧祭坛/哨塔:cellX = 5..7, cellY = 27..29(Cluster 2)。
    • 右侧主楼城垛:cellX = 10..12, cellY = 21..27(Cluster 1)。
  • 门楼未被合并为统一的复合建筑体。当玩家站在中间过道 cellX = 8, cellY = 30 时,既不属于 Cluster 1 也不属于 Cluster 2 的 cells 集合,被判定为“室外”,完全漏检。

缺陷三:过门拱廊瓦片未纳入屋顶遮挡层(Type 12/14 遗漏)

  • 在原版 townWest.ds1 中,跨越通道上方的拱门与连接结构采用了 type 12(Pillar/Archway 柱石拱顶)与 type 14(Overhead Wall 跨空上层墙)。
  • 当前引擎仅将 wall.type === 15(TileRoof)分离到 rawRoofs,而将 type 12 和 type 14 留在了普通墙面 rawWalls 中,普通墙面不支持动态 Fade,始终 100% 不透明渲染。

缺陷四:遮挡透明度目标不匹配(0.25 vs 0.0)

  • 当前 DEFAULT_MIN_ROOF_ALPHA = 0.25,即便触发遮挡,也仍残留 25% 的不透明度。
  • 原版中,遮挡玩家通道与建筑入口的关键屋顶是直接完全消失(alpha = 0.0),视线零阻碍。

3. 改造任务与实施计划

  1. 等轴测地面投影碰撞核(Ground-Footprint Projection):
    • 遮挡判定以地面网格空间(Ground Cell Space)为基准,屋顶根据其 roofHeight 与等轴测角度沿视线向地面投射有效遮挡足迹(Footprint)。
  2. 复合建筑过道缝合(Passage / Gate Bridge Clustering):
    • 优化聚类逻辑或引入复合建筑门楼关联,将城门两侧塔楼及跨道通道缝合为同一庇护群组。
  3. 跨道上层墙体与拱顶归一化(Overhead Tile Occlusion):
    • 识别悬空跨道瓦片(type 12 与 type 14 中高空跨梁),纳入动态可淡化图���。
  4. 对齐原版完全消失(Alpha = 0.0):
    • 支持平滑衰减至 0.0(完全隐去),还原原版遮挡消失体验。

4. 验收标准

  • 玩家走入哈洛加斯西城门门前或拱门通道时,城门门楼上方的遮挡屋顶与廊桥结构平滑淡出至完全消失(alpha = 0.0)。
  • 玩家离开城门区域后,屋顶与过梁平滑恢复至完全不透明(alpha = 1.0)。
  • 罗格营地阿卡拉帐篷、恰西铁匠棚、鲁高因民宅等旧场景的屋顶遮挡逻辑完全正常。
  • tests/roofs.test.ts 补充哈洛加斯城门与跨道廊桥遮挡测试用例,全量回归 100% 通过。
## 1. 现象描述与现场定位 在第五幕哈洛加斯(Harrogath)城门西出口(连接血腥丘陵 Bloody Foothills,`townWest.ds1`)处: - **玩家位置**:哈洛加斯西城门门洞正前方地面(网格坐标约 `cellX = 7..8, cellY = 30`)。 - **当前表现**:城门上方的箭楼拱桥、过道城垛及左侧祭坛屋顶完全不透明(`alpha = 1.0`),未发生任何衰减或消失,严重阻挡门洞及后方视野。 - **原版行为(Ground Truth)**:在原版暗黑破坏神2中,当角色走到城门拱门下方或门楼近前方时,整个门楼上方的遮挡层(包括屋顶与上层廊桥跨梁)会自动完全消失(`alpha = 0.0`),让玩家能够清晰看到门洞内部、穿行动线以及后方地形。 --- ## 2. 根因技术剖析(Root Cause Analysis) 审计当前 `src/render/roofs.ts` 与 `src/game/d2map.ts`,存在以下 4 处深层缺陷: ### 缺陷一:等轴测投影高度位移导致 2D Bounding Box 碰撞脱节 - 屋顶瓦片在世界空间的高度为 `roofHeight`(哈洛加斯城门屋顶 `roofHeight = 160` 像素)。 - 在 `d2map.ts` 中,屋顶贴图坐标被向上平移:`y = orthoY - tile.roofHeight`。 - 当前 `isPlayerOverlappingRoofBounds` 采用屏幕像素级 2D AABB 判定。当玩家站在地面(y ~ 1480)时,高空的屋顶贴图 AABB(y ~ 1200)在 Y 轴上与地面角色框**完全错开**,导致 AABB 判定恒为 `false`。 ### 缺陷二:城门过道间隙导致聚类断裂(Clustering Disconnection) - 当前 `clusterRoofs` 算法基于 `clusterCellDistance = 2` 进行图连通分支聚类。 - 哈洛加斯西城门中间通道宽度达到 3~4 个 cell(`cellX = 7..10`): - 左侧祭坛/哨塔:`cellX = 5..7, cellY = 27..29`(Cluster 2)。 - 右侧主楼城垛:`cellX = 10..12, cellY = 21..27`(Cluster 1)。 - 门楼未被合并为统一的复合建筑体。当玩家站在中间过道 `cellX = 8, cellY = 30` 时,既不属于 Cluster 1 也不属于 Cluster 2 的 `cells` 集合,被判定为“室外”,完全漏检。 ### 缺陷三:过门拱廊瓦片未纳入屋顶遮挡层(Type 12/14 遗漏) - 在原版 `townWest.ds1` 中,跨越通道上方的拱门与连接结构采用了 `type 12`(Pillar/Archway 柱石拱顶)与 `type 14`(Overhead Wall 跨空上层墙)。 - 当前引擎仅将 `wall.type === 15`(`TileRoof`)分离到 `rawRoofs`,而将 `type 12` 和 `type 14` 留在了普通墙面 `rawWalls` 中,普通墙面不支持动态 Fade,始终 100% 不透明渲染。 ### 缺陷四:遮挡透明度目标不匹配(0.25 vs 0.0) - 当前 `DEFAULT_MIN_ROOF_ALPHA = 0.25`,即便触发遮挡,也仍残留 25% 的不透明度。 - 原版中,遮挡玩家通道与建筑入口的关键屋顶是**直接完全消失**(`alpha = 0.0`),视线零阻碍。 --- ## 3. 改造任务与实施计划 1. **等轴测地面投影碰撞核(Ground-Footprint Projection)**: - 遮挡判定以地面网格空间(Ground Cell Space)为基准,屋顶根据其 `roofHeight` 与等轴测角度沿视线向地面投射有效遮挡足迹(Footprint)。 2. **复合建筑过道缝合(Passage / Gate Bridge Clustering)**: - 优化聚类逻辑或引入复合建筑门楼关联,将城门两侧塔楼及跨道通道缝合为同一庇护群组。 3. **跨道上层墙体与拱顶归一化(Overhead Tile Occlusion)**: - 识别悬空跨道瓦片(`type 12` 与 `type 14` 中高空跨梁),纳入动态可淡化图���。 4. **对齐原版完全消失(Alpha = 0.0)**: - 支持平滑衰减至 `0.0`(完全隐去),还原原版遮挡消失体验。 --- ## 4. 验收标准 - [ ] 玩家走入哈洛加斯西城门门前或拱门通道时,城门门楼上方的遮挡屋顶与廊桥结构平滑淡出至完全消失(`alpha = 0.0`)。 - [ ] 玩家离开城门区域后,屋顶与过梁平滑恢复至完全不透明(`alpha = 1.0`)。 - [ ] 罗格营地阿卡拉帐篷、恰西铁匠棚、鲁高因民宅等旧场景的屋顶遮挡逻辑完全正常。 - [ ] `tests/roofs.test.ts` 补充哈洛加斯城门与跨道廊桥遮挡测试用例,全量回归 100% 通过。
troytt added this to the [M16] 野外生成器原版一致性:还原 Blizzard DRLG 原生机制 milestone 2026-09-18 01:22:08 +00:00
Sign in to join this conversation.
No Label
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#72
No description provided.