/** Separate the last server pose from the pose currently drawn on screen. */ export function updateRemotePlayer(previous, packet, instant = false) { const preserve = previous && !instant; const targetYaw = packet.yaw ?? 0; return { ...packet, position: preserve ? previous.position : [...packet.position], target: [...packet.position], yaw: preserve ? previous.yaw : targetYaw, targetYaw, }; } export function smoothRemotePlayer(player, blend) { for (let axis = 0; axis < 3; axis++) player.position[axis] += (player.target[axis] - player.position[axis]) * blend; // Follow the shortest arc, including when server angles cross ±π or 2π. const delta = player.targetYaw - player.yaw; player.yaw += Math.atan2(Math.sin(delta), Math.cos(delta)) * blend; }