【战斗系统】怪物进入追击(Aggro)状态后移动方向与模型朝向不一致 #31

Closed
opened 2026-09-15 10:50:38 +00:00 by troytt · 1 comment
Owner

问题现象

在 Act 场景中,当怪物被玩家吸引仇恨(Aggro)并开始移动追击玩家时,怪物在画面中实际移动的方向与所渲染的怪物模型/动画朝向(Facing)存在明显夹角甚至完全相反。

根本原因排查分析

  1. 等轴测(Isometric)屏幕坐标系与 DCC 8 方向帧索引映射偏差:
    • Diablo II 的 DCC 动画采用了固定的 8 方向/16 方向(环状顺时针或逆时针排列,0通常为底/南向)。
    • 在 src/scene/act-scene.ts 中,渲染怪物时直接调用了 facingToDirection(monster.facing, art.directions)。
    • 该 facingToDirection 算法最初是为主角的平直 16 向设计的,并未适配游戏等轴测网格与视口投影(屏幕 2:1 等轴测矩阵,存在 45° / Math.PI/4 旋转变换),导致计算出的 direction 索引与 DCC 对应朝向产生偏移。
  2. 逻辑位置与物理朝向计算(Facing of delta):
    • combat.ts 的 tickMonster 中更新 monster.facing 时:
      monster.facing = facingOf(monster.x, monster.y, target.x, target.y);
    • 这里的 monster.x, monster.y 是基于 2D 平面还是等轴测视口未与移动增量统一;如果移动向量与渲染图层的投影轴未严格保持相同正负基准,就会出现“往右上走,面朝左下”或相差 90 度的现象。

建议解决方案

  1. 编写独立的 monsterFacingToDirection(facing: number, directions: number): number,严格对齐 D2 原版 DCC 8-direction 定义(以原点顺时针/逆时针方向对齐南、西南、西、西北、北、东北、东、东南)。
  2. 校准怪物物理追踪移动逻辑与渲染投影矩阵之间的坐标变换,补充单元测试与朝向可视化验证。
## 问题现象 在 Act 场景中,当怪物被玩家吸引仇恨(Aggro)并开始移动追击玩家时,怪物在画面中实际移动的方向与所渲染的怪物模型/动画朝向(Facing)存在明显夹角甚至完全相反。 ## 根本原因排查分析 1. **等轴测(Isometric)屏幕坐标系与 DCC 8 方向帧索引映射偏差**: - Diablo II 的 DCC 动画采用了固定的 8 方向/16 方向(环状顺时针或逆时针排列,0通常为底/南向)。 - 在 `src/scene/act-scene.ts` 中,渲染怪物时直接调用了 `facingToDirection(monster.facing, art.directions)`。 - 该 `facingToDirection` 算法最初是为主角的平直 16 向设计的,并未适配游戏等轴测网格与视口投影(屏幕 2:1 等轴测矩阵,存在 45° / Math.PI/4 旋转变换),导致计算出的 direction 索引与 DCC 对应朝向产生偏移。 2. **逻辑位置与物理朝向计算(Facing of delta)**: - `combat.ts` 的 `tickMonster` 中更新 `monster.facing` 时: `monster.facing = facingOf(monster.x, monster.y, target.x, target.y);` - 这里的 `monster.x, monster.y` 是基于 2D 平面还是等轴测视口未与移动增量统一;如果移动向量与渲染图层的投影轴未严格保持相同正负基准,就会出现“往右上走,面朝左下”或相差 90 度的现象。 ## 建议解决方案 1. 编写独立的 `monsterFacingToDirection(facing: number, directions: number): number`,严格对齐 D2 原版 DCC 8-direction 定义(以原点顺时针/逆时针方向对齐南、西南、西、西北、北、东北、东、东南)。 2. 校准怪物物理追踪移动逻辑与渲染投影矩阵之间的坐标变换,补充单元测试与朝向可视化验证。
Author
Owner

修复完成说明

已在提交 d6e6248 中修复:

  1. DCC 方向置换对齐:修复了 src/game/monster-art.ts 中直接以线性循环下标读取 dcc.directions[dir] 的问题,改为严格使用 dir64ToDcc(dir64, dcc.directions.length) 进行 8 方向排列对齐(原 DCC 8 向排列为 [4, 0, 5, 1, 6, 2, 7, 3])。
  2. 移动朝向角度规范化:优化了 src/game/combat.ts 的 facingOf 计算,与 act-scene.ts 保持一致,采用连续弧度投影并就近四舍五入到 8 方向,确保怪物在各种移动矢量下模型朝向与追击方向严格对齐。
### 修复完成说明 已在提交 `d6e6248` 中修复: 1. **DCC 方向置换对齐**:修复了 `src/game/monster-art.ts` 中直接以线性循环下标读取 `dcc.directions[dir]` 的问题,改为严格使用 `dir64ToDcc(dir64, dcc.directions.length)` 进行 8 方向排列对齐(原 DCC 8 向排列为 `[4, 0, 5, 1, 6, 2, 7, 3]`)。 2. **移动朝向角度规范化**:优化了 `src/game/combat.ts` 的 `facingOf` 计算,与 `act-scene.ts` 保持一致,采用连续弧度投影并就近四舍五入到 8 方向,确保怪物在各种移动矢量下模型朝向与追击方向严格对齐。
Sign in to join this conversation.
No Label
No Milestone
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#31
No description provided.