You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让物体跟随相机旋转 实现FPS游戏俯看时可见角色身体的效果

实现FPS身体跟随相机且俯看可见的解决方案

问题根因

你当前的代码将身体的三轴旋转完全和相机绑定,当相机向下俯仰(绕X轴旋转)时,身体模型会同步向下倾斜,要么直接移出相机视锥体范围,要么和相机近裁剪面重合被裁剪,因此俯看时看不到身体。

核心修改思路

  • 位置同步时增加向下的偏移量,保证身体默认在相机下方的视野范围内
  • 旋转仅同步水平方向(Y轴,左右转向的旋转),不同步俯仰方向(X轴,上下看的旋转),保证身体始终保持竖直站立状态

修改后代码

把原来的Update替换成下面的逻辑即可:

// 可在Inspector面板调整的偏移量,根据你的角色模型高度调整
public float bodyVerticalOffset = 1.5f;
private void Update()
{
    // 位置同步:相机位置向下偏移,保证身体在相机下方
    transform.position = arCamera.transform.position - arCamera.transform.up * bodyVerticalOffset;
    // 旋转同步:仅保留Y轴(水平转向)的旋转,丢弃X轴俯仰、Z轴翻滚的旋转
    transform.rotation = Quaternion.Euler(0, arCamera.transform.rotation.eulerAngles.y, 0);
}

可选优化方案

如果你的玩法需要身体跟随相机有轻微的俯仰动作,可以限制俯仰角度的最大值,避免身体完全朝下:

public float bodyVerticalOffset = 1.5f;
// 最大俯仰角度,可自行调整,比如最多向下转30度
public float maxPitchAngle = 30f;
private void Update()
{
    transform.position = arCamera.transform.position - arCamera.transform.up * bodyVerticalOffset;
    // 拿到相机的三轴角度
    Vector3 cameraEuler = arCamera.transform.rotation.eulerAngles;
    // 处理俯仰角度,限制在 -maxPitchAngle 到 maxPitchAngle 范围内
    float pitch = cameraEuler.x > 180 ? cameraEuler.x - 360 : cameraEuler.x;
    pitch = Mathf.Clamp(pitch, -maxPitchAngle, maxPitchAngle);
    // 赋值旋转
    transform.rotation = Quaternion.Euler(pitch, cameraEuler.y, 0);
}

注意事项

  • 调整bodyVerticalOffset时要避免模型太靠近相机,被相机近裁剪面裁剪
  • 确认身体模型的Layer没有被相机的Culling Mask排除

内容的提问来源于stack exchange,提问作者wldwkdrn thl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:00:02