obs-zoom-to-mouse-zh:汉化之外的一次 OBS 脚本维护
obs-zoom-to-mouse-zh Fork 自 BlankSourceCode/obs-zoom-to-mouse。我基于上游的核心思路参与了当前中文版本整套脚本的整理与构建,并参考 fixajteknik 的方案处理新版本 OBS 兼容问题。
这个仓库要解决什么问题
录制软件操作或代码讲解时,完整桌面里的文字往往太小。这个脚本需要在 OBS 中根据鼠标位置放大显示器捕获画面,并平滑跟随光标;鼠标停下来后还要留出一个安全区域,避免画面一直晃动。
旧版本已经有基础能力,但中文用户面对的是英文设置和英文文档,而且脚本在 OBS 32.0.2 上出现兼容问题。我的目标因此不是只翻译几行文字,而是交付一份在当前 OBS 中能加载、能配置、能缩放,也能按文档排错的中文版本。
我采用的整体方案
这个仓库最终保持得很小:一个约 1299 行的 Lua 主脚本、一份中英双语 README 和一个 GIF 演示。代码全部运行在 OBS Script API 中,不额外引入安装器或后台服务。
脚本内部按运行职责组织:平台层从 Windows、Linux 或 macOS 获取鼠标和显示器信息;来源层查找当前场景及嵌套场景中的目标源;坐标层计算桌面、来源、场景变换和裁剪后的对应关系;滤镜层创建并更新 Crop/Pad;状态层管理放大、缩小和已放大状态;配置层向 OBS 暴露属性、快捷键与保存项。
我参与整理的是这套完整运行关系,而不是只替换 UI 字符串。脚本从加载、选择来源、计算位置、创建滤镜,到快捷键触发动画和卸载时释放 OBS 对象,需要连成一个生命周期。
缩放为什么依赖裁剪滤镜
按下缩放快捷键后,脚本以当前鼠标位置为中心,计算目标裁剪区域,再逐帧改变 Crop/Pad 滤镜的宽、高和位置。插值与缓动函数让放大和缩小不会突然跳变。
自动跟随打开时,鼠标接近放大区域边缘才重新移动画面;鼠标停住后,脚本恢复安全区域。这部分通过 ZoomState、目标区域和计时状态共同控制,不能只用一个“是否放大”的布尔值。
脚本卸载或切换来源时,还要移除临时滤镜、恢复原始裁剪并释放 OBS source。对象没有正确释放,重新加载脚本后可能出现重复滤镜或失效引用。
坐标和来源兼容是主要难点
鼠标位置属于整个桌面,OBS 中的来源却可能被缩放、裁剪或放在嵌套场景里。脚本需要读取来源原始尺寸、场景变换、显示器位置和缩放系数,再把桌面坐标换到目标源上。
Windows、Linux 与 macOS 获取显示器信息的方式也不一样。显示器排列、主屏切换、方向和系统缩放发生变化后,旧的捕获源信息可能失效。对于普通显示器捕获,脚本尽量自动计算;对于浏览器源、克隆源等非显示器来源,则提供手动位置、尺寸和缩放参数。
OBS 32.0.2 的兼容修复也发生在这条链路中。我的排查顺序是先确认来源能被正确找到,再检查原始尺寸和 scene item 变换,最后核对裁剪滤镜与鼠标映射。直接调缩放倍率只能掩盖坐标问题。
中文化和文档怎么一起做
脚本设置、提示和日志完成中文化后,我重新整理了约 232 行中英双语 README,包含安装步骤、推荐的显示器捕获设置、快捷键、手动坐标、双机支持和已知限制。约 12 MB 的 GIF 直接展示最终效果。
之所以保留双语,是因为仓库仍然继承上游使用方式,英文读者也能核对原始概念。文档还明确说明 transform crop 与 Crop/Pad Filter 的区别,避免脚本自动修改布局后用户不知道发生了什么。
截至这次提交的复盘
这一版已经把 OBS 32.0.2 兼容、跨平台坐标、来源查找、滤镜生命周期、中文界面和使用文档整理为可直接加载的脚本。
当前限制也很明确:自动计算主要针对显示器捕获,非显示器源需要手动输入;桌面布局变化后通常要重建捕获源并重载脚本。复杂嵌套场景和系统缩放仍需要更多环境验证。
这次维护让我认识到,汉化项目同样包含完整的工程设计。语言只是用户能看到的一层,底下还要处理宿主 API、对象生命周期、坐标系统和安装说明,版本才能真正可用。




