[动画] 单位转向按 1.13c 转向表逐帧过渡(D2Common 0x6FDE41C8),目前是瞬间转向 #543
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象
fix/unit-facing修复后,单位的朝向(dir64)在每段路径开始时一步跳到目标方向,行走/跑步动画也立刻切到新方向那一行。1.13c 原版大角度转身(例如 180° 掉头)时会逐帧经过中间方向转过去,不会一帧跳变。1.13c 依据
转向步长表:D2Common
0x6FDE41C8,64 字节,按diff = (new − cur) & 63取步长,加到当前方向上(& 63)。设置目标方向:D2Common
0x6FD850B0和 #104250x6FD85270。D2DynamicPathStrc):+0x64nDirection(当前)、+0x65目标方向、+0x66diff。单步推进:D2Common #10603
0x6FD84D70,对应 D2MOOPATH_AdjustDirection(Path.cpp:822-846)。D2Client 调用点:
0x6FACC507(玩家)0x6FAFF665(怪物)0x6FABCD84调用。代码现状(
fix/unit-facing合并后)src/client/motion/predictor.ts:本地玩家每段路径开始时直接dir64 = dir64FromPoints(...)。src/client/motion/interpolate.ts:远端单位同样直接赋值。src/client/scene/world-renderer.ts:dir64ToClipDirection(unit.direction, dirCount)直接选动画行。上面三处都没有 current/target 之分,也没有按表逐步推进。
待确认(不要猜常数)
0x6FACC507/0x6FAFF665所在函数及其调用者确认。0x0D/0x0F/0x67/0x68/0x6D等)里的方向或目标坐标,客户端是当作目标方向(逐步转过去)还是直接设为当前方向。期望修复
current/target两个值,按 1.13c 的调用频率用0x6FDE41C8推进current,渲染只用current。0x6FDE41C8表为黄金值,校验各个 diff 的逐步推进序列。samples/d2/D2Common.dll中的表(参照tests/unit-direction.test.ts读0x6FDDD470/0x6FE2F4D8的写法)。相关
fix/unit-facing,commit0712b80fix(client): keep unit animation facing aligned with movement direction(dir64 规范化、dir64FromPoints/dir64ToClipDirection)。该分支尚未合并到 main:main 工作区里有其他进行中的未提交改动,ff 合并被拒。更新(2026-10-02):
fix/unit-facing已 rebase 到最新 main,fast-forward 合并并推送(6a01067..8fcd223)。正文里“尚未合并”的说法已过时。531273cea252b0dd775c80712b80,rebase 后哈希变了)8fcd223applySkillCastToUnit也改为写 dir64)本 issue 要做的逐帧转向还没有实现:dir64 仍然在每段路径开始时一步跳到目标方向。