统一固定四元数旋转
Posted
技术标签:
【中文标题】统一固定四元数旋转【英文标题】:Clamp a quaternion rotation in unity 【发布时间】:2021-12-07 17:49:29 【问题描述】:我有这段代码,但我无法找到一个合适的解决方案来将 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);
【问题讨论】:
好吧,我找到了一个可能的解决方案,以防它适用于某人:code
if(transform.rotation.x * 180f > yAxisMin && Input.GetAxis("Mouse Y") > 0 || transform.rotation.x * 180f code
其中yAxisMin和yAxisMax是y的最小值和最大值
但它仍然不能 100% 工作
【参考方案1】:
为此,您宁愿使用欧拉角,并且仅在应用夹子后将它们转换为Quaternion
!
切勿直接触摸Quaternion
的各个组件,除非您真的知道自己在做什么!一个Quaternion
有四个 组件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);
【讨论】:
再次感谢,我刚开始,四元数很棘手以上是关于统一固定四元数旋转的主要内容,如果未能解决你的问题,请参考以下文章