如何基于角度输入实现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平面的原始水平位置(地面高度)。
- 当输入角度为90度时,
- 自适应初始位置:无论相机初始在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
相关产品推荐
相关产品推荐

