Unity中带倾角正交相机的游戏向量幅值调整问题
俯视角正交相机移动速度补偿方案
核心思路
要让XZ平面内任意方向的移动在屏幕上的视觉速度一致,需根据相机绕X轴的倾斜角度a,对方向向量的「垂直分量」(即与Vector3.forward的点积绝对值)进行针对性缩放。
补偿公式推导
当相机倾斜角度为a时:
- 沿X轴的移动视觉速度恒定,无需额外补偿
- 沿Z轴(
forward方向)的移动视觉速度会随a减小而降低,缩放比例为sin(a)(a=90°时sin(a)=1,视觉速度与X轴一致;a=0°时sin(a)=0,视觉速度趋近于0)
因此,针对任意归一化方向向量v,最终的补偿乘数可按以下公式计算:
// 计算方向向量的垂直分量占比 float verticalComponent = Mathf.Abs(Vector3.Dot(v, Vector3.forward)); // 结合角度a计算补偿系数,添加极小值避免除零错误 float angleFactor = 1f / Mathf.Max(Mathf.Sin(a), 0.0001f); // 最终补偿乘数:仅对垂直分量进行补偿,水平分量无额外缩放 float m = (angleFactor - 1f) * verticalComponent;
极端场景验证
- 相机垂直向下(a=90°):
sin(90°)=1,angleFactor=1,m=0,无补偿,符合视觉速度一致的需求 - 相机平行地面(a=0°):
sin(0°)趋近于0,angleFactor趋近于无穷大,若v为forward方向,m也趋近于无穷大,可补偿视觉速度趋近于0的问题
实际应用示例
将补偿乘数应用到移动速度上,确保视觉速度统一:
// 基础移动速度 float baseSpeed = 5f; // 输入得到的归一化移动方向 Vector3 moveDir = new Vector3(inputHorizontal, 0, inputVertical).normalized; // 获取相机绕X轴的倾斜角度 float cameraAngleX = Camera.main.transform.eulerAngles.x; // 计算补偿乘数m float verticalComponent = Mathf.Abs(Vector3.Dot(moveDir, Vector3.forward)); float angleFactor = 1f / Mathf.Max(Mathf.Sin(cameraAngleX), 0.0001f); float m = (angleFactor - 1f) * verticalComponent; // 最终移动速度 float finalSpeed = baseSpeed * (1f + m); // 更新物体位置 transform.Translate(moveDir * finalSpeed * Time.deltaTime);
内容的提问来源于stack exchange,提问作者ceso
相关产品推荐
相关产品推荐

