Unity3D:求在半球边缘指定位置放置相机的C#函数
Unity半球面相机布局实现方案
核心逻辑
要完成需求,需分两步计算相机的位置与朝向:
- 位置计算:基于相机编号确定绕Y轴的方位角,结合基准面上方15°的仰角,将球面极坐标转换为Unity世界坐标。
- 朝向设置:让相机视轴垂直于球面,即相机镜头指向半球的球心(球面在该点的法线方向指向球心)。
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
相关产品推荐
相关产品推荐

