unity3d - 限制相机在 X 轴上的旋转角度
问题描述
我的相机总是在看一个物体A
。我添加了一段代码,让相机可以绕A
X轴旋转,如下图:
我的代码是这样的,每一帧都运行,根据鼠标垂直移动移动相机:
offset = transform.position - A.position;
offset = Quaternion.AngleAxis(Input.GetAxis("Mouse Y"), transform.right) * offset;
transform.position = A.position + offset;
transform.LookAt(A.position);
它工作正常,但是当相机试图在 X 轴上达到超过 90 的角度时,它开始出现错误并反转图像。如何限制相机角度,使其仅从 0 度移动到 90 度?游戏开始时,摄像机A
从 X 轴 30º 的角度观看。
解决方案
如果您的绿色 Vector 是 A local Y,蓝色是 A local Z(作为 Unity):您可以修复您的解决方案:
// Fix.
offset = transform.position - A.position;
offset = Quaternion.AngleAxis(Input.GetAxis("Mouse Y"), transform.right) * offset;
transform.position = A.position + offset;
Vector3 AUp = Quaternion.AngleAxis(90f, -A.right) * offset;
transform.LookAt(A.position, AUp);
像这样夹紧:
// Clamp.
offset = transform.position - A.position;
offset = Quaternion.AngleAxis(Input.GetAxis("Mouse Y"), transform.right) * offset;
float angle = Mathf.Atan2(A.InverseTransformPoint(offset).z, A.InverseTransformPoint(offset).y) * Mathf.Rad2Deg;
if (angle > 90f && angle < 180f)
{
transform.position = A.position + offset;
Vector3 AUp = Quaternion.AngleAxis(90f, -A.right) * offset;
transform.LookAt(A.position, AUp);
}
推荐阅读
- angular - 没有 FormControl 实例附加到具有名称的表单控件元素:
- firebase - Flutter - StreamProvider - 向 Firebase 发送重复出现的 XHR 请求
- python - 访问 GEKKO 最佳解决方案中的特定值
- flutter - Flutter Dart中EdgeInsetsGeometry类EdgeInsets类的区别?
- python - 在 pygame 中加载图像时遇到问题
- python - 如何估算/准备这种类型的时间序列数据?
- git - Git 状态无法识别目录连接
- python - 选择器有问题
- android - Android - 列出可以处理 ACTION_PROCESS_TEXT 意图的活动
- reactjs - 如何在 react-native-community google-signin 中设置 GoogleSignin 配置的客户端 ID?