c# - 统一固定四元数旋转
问题描述
我有这段代码,但我无法找到一个合适的解决方案来将 X 轴夹在 2 个角度值之间。在这种情况下怎么做?
public class CameraController : MonoBehaviour {
public float cameraSmoothness = 5f;
private Quaternion targetGlobalRotation;
private Quaternion targetLocalRotation = Quaternion.Identity;
private void Start(){
targetGlobalRotation = transform.rotation;
}
private void Update(){
targetGlobalRotation *= Quaternion.Euler(
Vector3.up * Input.GetAxis("Mouse X"));
targetLocalRotation *= Quaternion.Euler(
Vector3.right * -Input.GetAxis("Mouse Y"));
transform.rotation = Quaternion.Lerp(
transform.rotation,
targetGlobalRotation * targetLocalRotation,
cameraSmoothness * Time.deltaTime);
}
}
解决方案
为此,您宁愿使用欧拉角,并且仅Quaternion
在应用夹具后将其转换为!
Quaternion
除非您真的确切知道自己在做什么,否则切勿直接触摸 a 的各个组件!AQuaternion
有四个分量x
, y
,z
并且w
它们都在范围内移动-1
所以1
你尝试的意义不大;)
它可能类似于例如
// Adjust via Inspector
public float minXRotation = 10;
public float maxXRotation = 90;
// Also adjust via Inspector
public Vector2 sensitivity = Vector2.one;
private float targetYRotation;
private float targetXRotation;
private void Update()
{
targetYRotation += Input.GetAxis("Mouse X")) * sensitivity.x;
targetXRotation -= Input.GetAxis("Mouse Y")) * sensitivity.y;
targetXRotation = Mathf.Clamp(targetXRotation, minXRotation, maxXRotation);
var targetRotation = Quaternion.Euler(Vector3.up * targetYRotation) * Quaternion.Euler(Vector3.right * targetXRotation);
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, cameraSmoothness * Time.deltaTime);
}
推荐阅读
- html - 添加“扫描文档”选项以输入文件类型
- php - 在 aws RDS 服务器中与 sendy 一起使用的 php nginx 服务器中获取错误日志
- cucumber - 一个功能文件中的多个场景 - 如何清除在第一个场景中添加的项目?
- java - Mockito 更改传递给模拟的参数
- c++ - 将 R split() 函数转换为 C++
- r - 稍后在管道中访问结果
- javascript - 终端中的这是什么以及如何使其消失?
- angular - Angular、Rxjs、catch异常处理代码中抛出的异常
- android - 从android上的服务器获取数据
- git - 致命:远程端在初始推送到 bitbucket 时意外挂断