哈喽大家好,你的橙哥突然出现~
本系列博客地址:传送门
本节为Unity万向锁系列的最后一节,
这一节我们就来解决这个难题:使用四元数旋转,避免Unity万向锁。
代码示例:
private void Update()
{
transform.eulerAngles+=new Vector3(1,1,1);
}
优点:
缺点:
想要的运动 遇到万向锁,欧拉角无法差值运算代码:
if (Input.GetKeyDown(KeyCode.C)) { transform.localEulerAngles=Vector3.zero; transform.DOLocalRotate(new Vector3(90, 90, 90), 0.5f); }
优点:
四元数遇到万向锁可提供平滑的差值运算代码:
if (Input.GetKeyDown(KeyCode.C)) { transform.localEulerAngles = Vector3.zero; transform.DOLocalRotateQuaternion(Quaternion.Euler(new Vector3(90, 90, 90)), 0.5f); //或者: transform.Rotate(new Vector3(0, 90, 0)); }
缺点:
Dotween的四元数旋转,是先将要旋转到的目标欧拉角,转化为四元数,
再进行旋转。
举例:
transform.DOLocalRotateQuaternion(Quaternion.Euler(new Vector3(90, 90, 90)), 0.5f);
先将欧拉角转化为四元数,
再插值运算到目标欧拉角。
public float rotateSpeed = 2f;
Quaternion targetAngels;
private void Start()
{
targetAngels = Quaternion.Euler(0, 90f, 0);
}
void Update()
{
// 用 slerp 进行插值平滑的旋转
transform.rotation = Quaternion.Slerp(transform.rotation, targetAngels, rotateSpeed * Time.deltaTime);
// 当初始角度跟目标角度小于1,将目标角度赋值给初始角度,让旋转角度是我们需要的角度
if (Quaternion.Angle(targetAngels, transform.rotation) < 1)
{
transform.rotation = targetAngels;
}
}
将物体,绕自身的动态坐标系,旋转x角度。
举例:
transform.Rotate(new Vector3(0, 90, 0));
//或者:
transform.Rotate(0, 90, 0, Space.Self);
//或者:
transform.Rotate(new Vector3(0, 90, 0), Space.Self);
将物体,绕世界的静态坐标系,旋转x角度。
举例:
transform.Rotate(90, 0, 0, Space.World);
//或者:
transform.Rotate(new Vector3(0, 90, 0), Space.World);
1、四元数转化成欧拉角
Vector3 v3=transform.rotation.eulerAngles;
2、欧拉角转换成四元数
Quaternion rotation = Quaternion.Euler(v3);
今天的分享就到这里了,
大家还想看橙哥回答什么问题,可以到评论区留言告诉我哦。
如果你有技术上的问题或困扰
可以随时给我发私信
和我聊一聊你的困扰