统一固定四元数旋转

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);
    

【问题讨论】:

好吧,我找到了一个可能的解决方案,以防它适用于某人:codeif(transform.rotation.x * 180f > yAxisMin && Input.GetAxis("Mouse Y") > 0 || transform.rotation.x * 180f code 其中yAxisMin和yAxisMax是y的最小值和最大值 但它仍然不能 100% 工作 【参考方案1】:

为此,您宁愿使用欧拉角,并且仅在应用夹子后将它们转换为Quaternion

切勿直接触摸Quaternion 的各个组件,除非您真的知道自己在做什么!一个Quaternion四个 组件xyzw,它们都在-11 的范围内移动,所以你尝试的意义不大;)

可能是这样的,例如

// 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);

【讨论】:

再次感谢,我刚开始,四元数很棘手

以上是关于统一固定四元数旋转的主要内容,如果未能解决你的问题,请参考以下文章

四元数运动学笔记旋转的雅克比矩阵

四元数绕轴旋转的分量

四元数法

四元数运动学笔记四元数和旋转相关的约定表述

在 1 轴上旋转四元数?

将四元数旋转转换为旋转矩阵?