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

Unity3D:求在半球边缘指定位置放置相机的C#函数

Unity半球面相机布局实现方案

核心逻辑

要完成需求,需分两步计算相机的位置与朝向:

  1. 位置计算:基于相机编号确定绕Y轴的方位角,结合基准面上方15°的仰角,将球面极坐标转换为Unity世界坐标。
  2. 朝向设置:让相机视轴垂直于球面,即相机镜头指向半球的球心(球面在该点的法线方向指向球心)。

C#实现代码

using UnityEngine;

public class HemisphereCameraSetup : MonoBehaviour
{
    // 球心位置,默认设为世界原点,可根据需求调整
    public Vector3 sphereCenter = Vector3.zero;

    /// <summary>
    /// 在半球面指定位置创建并设置相机
    /// </summary>
    /// <param name="cameraId">相机编号(1-7)</param>
    /// <param name="hemisphereRadius">半球半径</param>
    /// <returns>创建好的相机对象</returns>
    public Camera CreateCameraOnHemisphere(int cameraId, float hemisphereRadius)
    {
        // 校验相机编号合法性
        if (cameraId < 1 || cameraId > 7)
        {
            Debug.LogError("相机编号必须在1-7之间");
            return null;
        }

        // 1. 计算方位角:每个相机间隔360/7度,编号1对应0度,编号2对应360/7度,以此类推
        float azimuthAngle = (cameraId - 1) * (360f / 7f);
        // 2. 计算极角:基准面上方15°,对应从Y轴正方向向下偏移75°(Unity中Y轴向上)
        float polarAngle = 90f - 15f;

        // 3. 将极坐标转换为笛卡尔坐标
        float azimuthRad = Mathf.Deg2Rad * azimuthAngle;
        float polarRad = Mathf.Deg2Rad * polarAngle;

        float x = hemisphereRadius * Mathf.Sin(polarRad) * Mathf.Cos(azimuthRad);
        float y = hemisphereRadius * Mathf.Cos(polarRad);
        float z = hemisphereRadius * Mathf.Sin(polarRad) * Mathf.Sin(azimuthRad);

        Vector3 cameraPos = sphereCenter + new Vector3(x, y, z);

        // 4. 创建相机对象并设置位置
        GameObject cameraObj = new GameObject($"Hemisphere_Camera_{cameraId}");
        Camera camera = cameraObj.AddComponent<Camera>();

        camera.transform.position = cameraPos;

        // 5. 设置相机朝向:指向球心,确保视轴垂直于球面
        camera.transform.LookAt(sphereCenter);

        // 可选:设置相机基础参数,可根据需求调整
        camera.fieldOfView = 60f;
        camera.nearClipPlane = 0.1f;
        camera.farClipPlane = 1000f;

        return camera;
    }

    // 示例:一键创建所有7个相机
    [ContextMenu("创建所有半球相机")]
    public void CreateAllCameras()
    {
        float radius = 250f;
        for (int i = 1; i <= 7; i++)
        {
            CreateCameraOnHemisphere(i, radius);
        }
    }
}

代码说明

  • 坐标转换:通过极坐标转笛卡尔坐标的公式计算相机位置,其中:
    • azimuthAngle:绕Y轴的水平旋转角度,确保7个相机等距分布在圆周上
    • polarAngle:控制相机在基准面上方15°的高度,通过Y轴偏移量实现
  • 朝向设置:LookAt(sphereCenter)让相机镜头指向球心,此时相机的视轴正好与球面在该点的法线重合,满足“视场垂直于球面”的要求
  • 参数校验:加入了相机编号的合法性检查,避免非法输入导致的错误
  • 示例方法:通过ContextMenu标签可以在Unity编辑器中右键调用,一键创建所有7个相机

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:45:32