放大缩小地图时,NPC 名字标签与 NPC 人物位置偏移错位 #135
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?
问题描述
参考截图:https://screenshot-v2.corp.google.com/12hbrk7d7cgj0
在罗格营地等城镇放大/缩小地图(或在高分屏
devicePixelRatio > 1下)时,NPC 名字 DOM 标签(如 Deckard Cain、Kashya、Warriv、Rogue)与实际渲染的 NPC 人物精灵位置对应不上,出现明显向右下偏移。根因分析
ViewportCamera.syncCanvasSize(canvas)将canvas.width和canvas.height乘上了缩放因子scale = Math.min(dpr, Math.sqrt(maxPixels / (cssWidth * cssHeight)))。而 WebGL 顶点着色器使用
u_viewport = (canvas.width, canvas.height)将世界坐标投影到 NDC[-1, 1],最终映射到屏幕 CSS 坐标(cssWidth, cssHeight)。但
src/scene/act-scene.ts第 2484–2500 行计算 NPC DOM 标签位置时写成了: 直接将物理像素坐标赋给了 CSSleft/top,未乘以cssWidth / canvas.width与cssHeight / canvas.height,导致在dpr !== 1或缩放时整体偏离屏幕中心与人物。frame.offsetX / offsetY):对象层绘制 NPC 时使用了
obj.x + obj.frame.offsetX与obj.y + obj.frame.offsetY,而标签使用了固定npc.y - 60 * camera.zoom。解决方案
将 NPC 名字投影严格对齐 WebGL 视口矩阵(乘上
cssWidth / canvas.width与cssHeight / canvas.height)并使用 NPC 精灵真实包围盒顶部中心(npc.x + frame.offsetX + frame.width / 2, npc.y + frame.offsetY - 6)(或直接在等比对齐的 Canvas 上渲染),保证任意缩放倍率与任意 DPR 下 100% 紧贴 NPC 头顶。验证通过并已随提交
14443c6修复关单改动方案:
src/scene/act-scene.ts中推导严格抵消 DPR 乘数的 WebGL NDC 投影变换,并在computeHudLayout中精确换算至 CSS DOM Overlay 像素坐标系。验证结果: