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

如何基于角度输入实现Unity相机沿球面上下环绕目标物体

Unity 相机沿球面轨迹移动实现方案

核心思路

我们需要保持相机与目标物体的水平方向(X-Z平面)朝向不变,通过输入的0-90度角度计算相机的垂直高度,让相机沿球面轨迹移动。关键是先提取相机与目标的水平方向向量,固定水平距离,再结合三角函数计算新位置。

完整实现代码

void moveCamUpDownToDegree(float degree, Camera cam, Transform centerObjectTransform) {
    Vector3 newCamPosition;

    // 1. 提取相机与目标的水平方向(剔除Y轴分量)
    Vector3 originalHorizontalDir = cam.transform.position - centerObjectTransform.position;
    originalHorizontalDir.y = 0; // 只保留X-Z平面的方向
    float fixedHorizontalDistance = originalHorizontalDir.magnitude; // 固定水平距离,保证X-Z角度不变

    // 2. 将角度转换为弧度(Unity三角函数用弧度计算)
    float radian = degree * Mathf.Deg2Rad;

    // 3. 计算新位置的水平偏移和垂直高度
    Vector3 horizontalOffset = originalHorizontalDir.normalized * fixedHorizontalDistance * Mathf.Cos(radian);
    float verticalHeight = fixedHorizontalDistance * Mathf.Sin(radian);

    newCamPosition = centerObjectTransform.position + horizontalOffset + Vector3.up * verticalHeight;

    // 更新位置并看向目标
    cam.transform.position = newCamPosition;
    cam.transform.LookAt(centerObjectTransform);
}

关键逻辑说明

  • 固定水平朝向:通过剔除原始位置的Y轴分量,确保相机在上下移动时,始终保持与目标的X-Z平面角度一致。
  • 三角函数计算轨迹:
    • 当输入角度为90度时,cos(90°)=0,sin(90°)=1,相机位于目标正上方(俯视位置)。
    • 当输入角度为0度时,cos(0°)=1,sin(0°)=0,相机落在X-Z平面的原始水平位置(地面高度)。
  • 自适应初始位置:无论相机初始在X-Z平面的哪个方向,都会基于当前朝向计算移动轨迹,无需额外设置角度参数。

可选调整:固定直线距离

如果需要保持相机与目标的直线距离不变(而非水平距离),可以修改计算逻辑:

void moveCamUpDownToDegree(float degree, Camera cam, Transform centerObjectTransform) {
    Vector3 newCamPosition;

    float fixedStraightDistance = Vector3.Distance(cam.transform.position, centerObjectTransform.position);
    Vector3 originalHorizontalDir = cam.transform.position - centerObjectTransform.position;
    originalHorizontalDir.y = 0;
    originalHorizontalDir.Normalize();

    float radian = degree * Mathf.Deg2Rad;
    Vector3 horizontalOffset = originalHorizontalDir * fixedStraightDistance * Mathf.Sin(radian);
    float verticalHeight = fixedStraightDistance * Mathf.Cos(radian);

    newCamPosition = centerObjectTransform.position + horizontalOffset + Vector3.up * verticalHeight;

    cam.transform.position = newCamPosition;
    cam.transform.LookAt(centerObjectTransform);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:13:20