无遮挡第三人称摄像机

无遮挡第三人称摄像机

一个Hytale服务器插件,提供功能齐全的第三人称视角系统,具备服务器权威的方块/实体交互校正、摄像机周围自动方块透明化功能,以及基于俯仰角的第一人称切换功能。

生活质量

无障碍第三人称摄像机插件

描述已过时——需要更新 目前不建议使用半径命令调整任何设置,仅使用预设

这是一个 Hytale 服务器插件,提供功能完整的第三人称摄像机系统,包括服务器权威的方块/实体交互修正、摄像机周围方块的自动透明化,以及基于俯仰角的第一人称切换。

推荐资源包: 我的第三人称包

功能

  • 摄像机透明体积 — 自动使摄像机周围椭球体内的方块变透明,确保视角不被附近的几何体遮挡
  • 基于俯仰角的第一人称切换 — 当玩家视角陡峭向上或向下(超过 ±55°)时自动切换到第一人称,角度恢复后回到第三人称
  • 玩家加入世界时自动执行默认设置命令

命令

/UnobstructedCamera(别名:/NoClipCamera/UCamera/UC

控制摄像机的主命令组。

子命令 描述 用法
Start 激活第三人称摄像机 /UC Start [--radius]
Stop 停用摄像机并恢复默认设置 /UC Stop

Start 接受可选的 Radius 浮点数参数,用于设置透明区域的半径(默认值:6.0)。

示例:

/UC Start                — 使用默认半径(6.0)启动
/UC Start --radius 10.0  — 启动,摄像机位于玩家后方10格
/UC Stop                 — 恢复默认摄像机

工作原理

摄像机激活流程

  1. 玩家运行 /UC Start
  2. 创建一个半径为5的椭球体 CameraTransparencyVolume
  3. 向客户端发送 SetServerCamera 数据包

摄像机透明体积

为防止摄像机位于实心方块内部(在墙壁/天花板附近的第三人称视角中常见)

  1. 每帧计算摄像机的方块空间位置
  2. 围绕摄像机锚点维护一个椭球体方块位置体积
  3. 通过 UpdateBlockTypes 数据包向客户端发送假透明方块类型
  4. 使用 ServerSetBlock 将客户端上的真实方块替换为透明变体
  5. 当方块离开体积或摄像机停用时恢复原始方块
  6. 玩家重新连接时重置所有跟踪状态,避免纹理引用过期

未来功能

  • ⏹️ 在加载/卸载透明方块时增加小延迟或缓冲区域,防止"闪烁"
  • ⏹️ 改善与梯子的兼容性
  • ⏹️ 添加第二层透明方块以平滑过渡
  • ⏹️ 在玩家脚底添加"阴影"对象,俯视时提供位置参考
  • 🔽 进一步增强资源编辑器能力
  • ✅ 在摄像机低于脚部时加入摄像机碰撞检测
  • ✅ 摄像机视角切换的默认覆盖

已知错误

  • 🐞 切换摄像机模式可能导致摄像机穿过地面
  • 🐞 在"透明"方块椭球体内破坏方块可能会产生幽灵方块
  • ☑️ 与更新3的不兼容警告
  • ☑️ 使某些物体透明时偶尔崩溃
  • ☑️ 首次运行命令导致某些方块纹理为空
  • ☑️ 旋转摄像机加载新方块后可解决
  • ☑️ 加载模组后,必须使用命令在第一人称和第三人称视角间切换
  • ☑️ 客户端预览方块放置和方块选择功能失效
  • ☑️ 面向南方时,破坏方块的能力可能不一致。
  • ☑️ 在某些情况下,传送至新世界后可能无法破坏方块

已移除功能——计划重新加入

点击展开

基于俯仰角的第一人称切换

当玩家视角陡峭向上或向下(与水平线夹角超过 ±55°)时,插件自动移除玩家角色视图。这避免了查看玩家脚部或直视上方时出现的尴尬摄像机角度。该切换仅在状态实际变化时发送 SetServerCamera 数据包,避免数据包洪泛。


为性能和可靠性移除的内容

点击展开
  1. CustomCameraSettings 创建一个 ServerCameraSettings,包含:
    • distance = 3.0(或自定义)、positionOffset = (0, 1, 0)eyeOffset = true
    • isFirstPerson = falsedisplayReticle = true
    • 位置/旋转插值速度 0.9
  2. 为玩家启用 InteractionPositionFixer,并接收摄像机设置

交互位置修正

Hytale 的交互系统是客户端权威的:客户端计算准星对准的方块并向服务器发送该位置。在自定义第三人称摄像机中,客户端的瞄准目标可能与服务器预期的不同,因为服务器原生不处理摄像机偏移。InteractionPositionFixer 通过以下方式解决:

  1. 每100毫秒从摄像机原点(eyePos + positionOffset)沿玩家视线方向执行服务器端射线追踪
  2. 射线追踪跳过由 CameraTransparencyVolume 设为透明的方块(使用 TargetUtil.getTargetBlockAvoidLocations
  3. 拦截传入的 SyncInteractionChains 数据包,将方块/实体位置重写为服务器计算的目标
  4. 清除重复的 ClientPlaceBlock 数据包,并在客户端预测位置重新同步幽灵方块
  5. 修正放置交互的 BlockFace,使相邻方块正确朝向

默认摄像机设置

设置
distance 3.0
positionOffset (0, 1, 0)
eyeOffset true
isFirstPerson false
displayReticle true
positionLerpSpeed 0.9
rotationLerpSpeed 0.9