如何夹住四元数以保持在另一个四元数的特定角度内

How to clamp a quaternion to stay within a certain angle of another

我们有一个头 object 和一个 body object。 这两个object是分开的children一个人object。

我需要让头部 object 左右自由旋转,我已经做到了。 我还需要使 body object 随头部左右旋转 object 仅当两个四元数之间的旋转差为 +/- 90 度时。

换句话说,我应该可以左右自由移动头部,如果头部与body的旋转角度差小于或大于90度,那么body 将开始旋转头部,如果旋转在 +/- 90 度范围内则停止。 body 的旋转不应与头部的旋转对齐,而是确保它保持在头部可以旋转的不可见 180 度圆锥内。

虽然你可以这样做:

    var rotation = Input.GetAxis("Mouse X") * speed * Time.deltaTime;
    Head.transform.RotateAround(Vector3.up, rotation);
    var angle = Quaternion.Angle(Head.transform.rotation, Body.transform.rotation);
    Debug.Log(angle);
    if(angle > 90)
    {
        Body.transform.RotateAround(Vector3.up, rotation);
    }

当你向上或向下看超过 90 度时它也会旋转。所以最好让输入修改角度,夹紧 body 角度,然后将它们设置为旋转。

    var rotation = Input.GetAxis("Mouse X") * speed * Time.deltaTime;
    headAngle = headAngle + rotation;
    bodyAngle = Mathf.Clamp(bodyAngle, headAngle - 90, headAngle + 90);

    Head.transform.rotation = Quaternion.AngleAxis(headAngle, Vector3.up);
    Body.transform.rotation = Quaternion.AngleAxis(bodyAngle, Vector3.up);