正确的第三人称视角(第三人称摄像机)

正确的第三人称视角(第三人称摄像机)

《天国:拯救2》的第三人称视角模组,包含相机碰撞剔除修正、基于部分射线投射的准星修复,以及实验性的自由视角环绕模式。

游戏玩法

前言

不久前,我制作了第三人称视角(TPV 摄像机)启用器,它开启了游戏内置的调试用第三人称摄像机。那个摄像机并非为正常游戏而设计,因此解决它的古怪特性和限制变成了一项艰巨的任务,我最终花费了远多于构建新功能的时间来修复破损的东西。

这个模组是从相反方向进行的完全重写。它没有借用调试摄像机,而是让游戏保持在普通的第一人称模式,并在其之上重建了第三人称视角,然后添加了真正重要的部分:简单的摄像机碰撞和基于射线投射的准星对齐。它简单得多,而且效果也确实更好。有趣的是,用这种方式完成它大约只花了两周时间,而我修补旧方法却花了将近一个月。

现在仍处于早期阶段,所以如果有任何感觉不对劲的地方,或者您有想法能让它变得更好,请告诉我。希望您喜欢它,也感谢您尝试它。

注意:请原谅我糟糕的视频质量和帧率 T_T

https://www.youtube.com/watch?v=NuCQHDoQnVE

主要功能

  • 可随时切换的第三人称视角(默认:F3,或按住 LB + RB)
  • 过肩视角框架,可调节距离、高度和侧向偏移
  • 实时拉近或拉远摄像机
  • 基本的自由观察模式,可环顾角色四周(早期,参见已知限制)
  • 根据情境自动切换视角:进入战斗、瞄准弓箭、对话、小游戏、骑马或菜单时切换到第一人称或第三人称(期间仍可手动切换),情境结束时恢复之前的视角
  • 游戏内预设管理器:从覆盖界面编辑、添加和保存摄像机预设;内置的普通游戏、战斗、瞄准、骑马、潜行和特殊姿势(躺下、坐下、跪下、乘坐马车)预设会根据情境自动应用,您还可以将自定义预设绑定到状态组合(例如蹲下瞄准),最具体的匹配项优先
  • 自由观察的灵敏度分别为鼠标和手柄的每个轴独立设置,因此水平和垂直可以单独调整;设置负值可反转该轴。将任何预设设置标记为“共享”,可将其值立即应用于所有预设
  • 摄像机碰撞,带可选透视模式(默认关闭),可忽略可以看透的细柱、栏杆和围栏,并避免进入角落;还有布料屋顶夹持(默认开启),可防止低头时钻入帐篷或遮阳篷的布料中;所有设置均可在 INI 文件中调整
  • 准星与您指向的目标保持对齐(部分实现,仅适用于交互,尚未达到 100%)
  • 完全支持键盘和 XInput 控制器
  • 几乎所有设置都可以在游戏运行时实时编辑
  • 开源,完全透明

一旦进入游戏,第三人称视角会自动开启;按下切换键可切回第一人称,或者将 INI 中的 AutoEnableTPV = false 设置为以第一人称开始。

需求

  • 天国:拯救 II(Steam 或 GOG 版本)
  • 一个 ASI 加载器 - 不包含,您需要自行下载(参见下面的步骤 1)

安装

这个模组是一个 .asi 插件,因此需要一个 ASI 加载器来运行。加载器不包含在此下载中 - 您自行安装一次(步骤 1)。如果您已经为 KC:D 2 从其他模组安装了 ASI 加载器,请跳到步骤 2。

如果您安装了旧的 KCD2_TPVToggle 模组,请先将其移除:从游戏目录中删除 KCD2_TPVToggle.asiKCD2_TPVToggle.ini。TPVCamera 会替代它,同时运行两者会产生冲突。

步骤 1:安装 ASI 加载器

下载 ThirteenAG 制作的 Ultimate ASI Loader,并将其中一个 DLL 文件放入游戏的二进制文件夹(包含 WHGame.dllBin/Win64MasterMaster... 子文件夹):

每个链接下载一个 ZIP 文件;仅提取 DLL 文件并将其放到 WHGame.dll 旁边。

步骤 2:安装模组

  1. 从“文件”选项卡下载最新版本。
  2. 将所有文件解压到同一个二进制文件夹中,位于 WHGame.dll 和加载器 DLL 旁边: <KC:D 2 安装文件夹>/Bin/Win64MasterMasterSteamPGO/ GOG 版本使用其自己的 Bin/Win64MasterMaster... 文件夹。

步骤 3:启动并游玩

启动游戏;一旦进入游戏,第三人称视角会自动开启。按 F3(或在控制器上按住 LB + RB)切回第一人称。

如何验证加载器是否工作: 启动一次后,检查二进制文件夹中是否存在 KCD2_TPVCamera.log 文件。如果没有,则加载器未加载模组 - 将您的加载器 DLL 重命名为其他变体(version.dllwinmm.dll)并重新启动。

文件夹布局(所有文件都放在二进制文件夹中,位于 WHGame.dll 旁边):

Bin/Win64MasterMasterSteamPGO/
|-- WHGame.dll                      (游戏)
|-- dinput8.dll                     (ASI 加载器 - 您下载的)
|-- KCD2_TPVCamera.asi              (本模组)
|-- KCD2_TPVCamera.ini              (设置)
\-- KCD2_TPVCamera_presets.json     (首次运行时创建)

Linux / Steam Deck(Wine/Proton)

您的 ASI 加载器 DLL 需要 Wine/Proton DLL 重写,以便游戏加载它而不是内置版本。如果您安装了 dinput8.dll(推荐的加载器):

Steam: 前往游戏的属性 -> 启动选项,并添加: WINEDLLOVERRIDES="dinput8=n,b" %command%

命令行: 在您的启动命令前加上: WINEDLLOVERRIDES="dinput8=n,b"

如果您选择了不同的加载器 DLL,请改用其名称(例如 winmm=n,b 用于 winmm.dll)。

默认控制

所有按键均可在 KCD2_TPVCamera.ini 中重新绑定。

  • 进入/退出第三人称: F3,或按住 LB + RB
  • 切换自由观察模式: F4,或按住 LB + 点击左摇杆(LS)
  • 按住进行自由观察: 默认未绑定(瞬时自由观察:按住环顾四周,松开后弹回)
  • 打开预设管理器覆盖界面: Home
  • 拉近: LShift + PageUp,或按住 LB + D-pad 上
  • 拉远: LShift + PageDown,或按住 LB + D-pad 下
  • 强制第一人称 / 强制第三人称: 默认未绑定

在控制器上,缩放功能与游戏的库存/地图快捷键共享 D-pad,因此模组在您缩放时会向游戏隐藏该 D-pad 按钮(ZoomInKey.Consume / ZoomOutKey.Consume 键,默认开启),这样完成缩放后不会打开库存或地图。如果您希望 D-pad 继续用于游戏,则将其设置为 false。键盘缩放键不受影响。

配置

编辑 KCD2_TPVCamera.ini,按组分类:

  • [Settings] - 日志级别、视角热键、预设覆盖界面键和会话开始的自动启用标志
  • [Camera] - 缩放键、摄像机空间交互切换和视角过渡缓动(视角框架本身按预设设置)
  • [Orbit] - 自由观察模式键(按下切换和瞬时按住)以及光标冻结(自由观察手感按预设设置)
  • [Collision] - 碰撞探测和半径、UseCoverageCollision(仅当物体遮挡角色时才拉近)及其覆盖/侧壁选项,以及独立的 UseRenderOcclusion 布料屋顶夹持(启用、蒙皮和返回速度按预设设置)
  • [StateBehavior] - 进入情境时切换第一/第三人称(战斗、瞄准、对话、小游戏、骑乘、菜单、覆盖界面),退出时恢复先前的视角(期间的手动切换保持不变),以及在选定情境中暂停/恢复自由观察
  • [Presets] - 预设混合速度;摄像机框架位于游戏内预设管理器(按 Home 键打开)中,并存储在 INI 旁边的 KCD2_TPVCamera_presets.json 中。该文件在首次运行时从内置默认值自动创建;它不随模组分发,因此更新模组永远不会覆盖您调整过的预设。

大多数值在您保存文件后的下一帧生效。

热键格式

  • 命名键:V, F3, Numpad1, Mouse4, Gamepad_A 等。
  • 修饰键:Ctrl, Shift, Alt(或 LCtrl, RCtrl 等)
  • 多组合:F3,Gamepad_LB+Gamepad_RB(单独 F3 或按住 LB + 按下 RB)
  • 空值禁用绑定

请参阅支持的输入名称参考中的完整列表。

配合控制器使用

DetourModKit 通过 XInput API 原生支持手柄输入。直接在 INI 中使用手柄按钮名称:

; 用手柄 Y 按钮切换
ToggleViewKey = Gamepad_Y

; 使用修饰键组合(按住 LB + 按下 RB)
ToggleViewKey = Gamepad_LB+Gamepad_RB

; 多个独立组合(逗号 = 或)
ToggleViewKey = F3,Gamepad_LB+Gamepad_RB

仅限 XInput: Xbox 控制器原生工作。对于 PS4/PS5/Switch 控制器,请使用 XInput 转换层(例如 DS4Windows、DualSenseX、BetterJoy)或 Steam Input 将您的控制器模拟为 XInput。详细信息请参阅手柄兼容性

推荐模组

这些模组与第三人称摄像机配合良好:

  • 无头盔视野 - 移除在第三人称下显得格格不入的头盔视野黑边/黑条。
  • 第一人称大修 - 使某些动作和交互保持在第三人称,而不是强制将视角切换回游戏默认摄像机。
  • 可选战斗(可选)- 修改战斗和摄像机锁定行为,使近战战斗更自由,目标切换更容易。

已知限制

  • 自由观察模式是一个原始的概念验证:用于旋转摄像机查看亨利正面效果不错,但对于正常游戏来说很粗糙(观察模式下交互尚未生效)。
  • 自由观察模式在骑马和战斗中与游戏自身的摄像机控制冲突,因此在那些情境下会自动禁用。
  • 在某些动画中,第一人称的身体骨架从后面看仍然可能略微奇怪。
  • 摄像机碰撞可防止视角穿墙,但尚无柔和边缘平滑处理。
  • 基于射线投射的准星修复是部分的:它不涵盖所有交互类型,因此有些交互仍然显示视差或偏移,并且在有多个可交互物体的密集区域,使用提示会来回跳跃。
  • 第三人称下的某些世界交互仍然可能不流畅或有错误;如果某个交互看起来有问题,请关闭摄像机。
  • 预设覆盖界面有意不挂接游戏的交换链:它通过私有 WARP 设备渲染,并使用 GDI 位块传输进行合成,这使其与 ReShade 和 OptiScaler 等覆盖界面和注入器兼容。代价是打开覆盖界面时帧率下降;由于它只是一个您短暂打开进行调节的面板,而不是玩着玩的,因此这是可以接受的。

路线图

  • 重做自由观察模式,使其可在正常游戏中可用(观察期间交互、更平滑的启用/释放、更好的鼠标手感),包括解决在骑马和战斗中(目前自由观察被自动禁用)与游戏自身摄像机的冲突。
  • 软边缘摄像机碰撞,使视角绕过障碍物时更平滑,而不是直接弹跳。
  • 更干净地处理摄像机和角色之间的薄遮挡物(围栏栏杆、薄树叶)。
  • 修复角色背后的阴影被剪裁的问题(阴影级联仍然跟随第一人称视野)。
  • 扩展基于射线投射的准星/交互修复,以覆盖更多交互类型,并防止在密集区域中,使用提示在附近的可交互物体之间跳跃。

游戏更新后: 模组通过几个备用签名定位其挂接的每个游戏函数,因此它会自动适应微小的游戏变化。如果核心游戏函数被大量重写,重大更新可能仍需要模组更新。

致谢与源代码

使用 DetourModKit 构建核心功能。

  • Ultimate ASI Loader 由 ThirteenAG - ASI 加载层
  • SafetyHook 由 cursey - 内联/函数中间挂接
  • Zydis / Zycore 由 Florian Bernd & Joel Höner - x86/x64 反汇编(由 SafetyHook 使用)
  • SimpleIni 由 Brodie Thiesfield - INI 配置解析器
  • nlohmann/json 由 Niels Lohmann - JSON 预设序列化
  • Dear ImGui 由 Omar Cornut - 覆盖界面 GUI
  • DirectXMath 由 Microsoft - 数学基元
  • Frans 'Otis_Inf' Bouma - 他的摄像机工具和灵感,以及模组制作方向和指导
  • Warhorse Studios 创造了这款精彩的游戏

我所有的《天国:拯救 II》模组和工具都可以在这个 GitHub 仓库中找到。欢迎贡献或提出改进建议!