如何夹住四元数以保持在另一个四元数的特定角度内
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);
我们有一个头 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);