Unity 中的旋转

本文深入探讨Unity中的旋转,包括Editor中Transform的旋转、使用rotate函数在Space.Self和Space.World中的旋转。重点解析静态欧拉角和动态欧拉角的区别,以及万向节锁现象,提出如何规避万向节锁问题。同时,介绍了四元数在旋转表示中的优势。
摘要由CSDN通过智能技术生成
参考

1、关于万向节死锁

2、【Unity技巧】四元数(Quaternion)和旋转、

一、Unity中的Rotation

        在unity中,旋转的表示的常用方法之一,是一个三维向量(x、y、z):

Unity 中的旋转0

图1、Unity中的旋转

        实际上这是欧拉角。这三个分量分别是绕x轴、y轴、z轴旋转的角度。

        要对一个object进行旋转,还可以通过代码:

transform.Rotate(x, y, z);

        这里,如果看过《坐标系》一文,就会产生以下两个疑问:

        1)x轴、y轴、z轴指的是那组基?是世界坐标系下的xyz轴,还是本地坐标系下的xyz轴?

        2)旋转的正方向是如何确定的?

        下面分别讨论。

二、旋转轴:静态欧拉角和动态欧拉角

        首先回答第一个问题:到底哪个是旋转轴。这又要分为 3种情况。

1、旋转轴:Editor 中 Transform的旋转数值

        对这个情况来说,其显示的旋转轴既不是世界坐标系的坐标轴,也不失本地坐标系的坐标轴。Editor中transform的旋转轴是父节点的坐标轴。这点在editor中看的非常明显,因此不再赘述。


2、旋转轴:在script中使用 rotate 函数,在 Space.Self 中旋转

        Rotate 函数有两个入参:

public void Rotate(Vector3 eulerAngles, Space relativeTo = Space.Self);

        第二个入参的取值有两种:Space.Self 或者 Space.World。我们先看默认的 Self 的情况。使用下面的一段简单的代码来进行测试:

public class TestRotate : MonoBehaviour {

    public Space rotateSpace;

    // Update is called once per frame
    void Update () {
        if (Input.GetKeyDown(KeyCode.R))
            transform.Rotate(new Vector3(0, 10, 0), rotateSpace);
    }
}
        场景中进行测试的是一个圆柱体,其父节点的旋转为(30,30,0),圆柱体初始的旋转为(30,0,0),每次按下R键,就会在Space.Self 下绕 Y轴旋转10度,则结果为:
Unity 中的旋转1
图2、在Space.Self中旋转

        可以看到,圆柱体是绕着本地坐标系的Y轴旋转的。使用Space.Self进行旋转,旋转轴就是本地坐标系的坐标轴


3、在script中使用 rotate 函数,在 Space.World 中旋转

        下面测试 Space.World 

Unity 中的旋转2

图3、在Space.World中旋转

        注意到这里 Parent 的 Y轴并不是 world 的 Y 轴,而这里的圆柱体明显是绕着世界坐标系下的 Y 轴旋转的,所以如代码所述, 使用Space.World旋转,旋转是绕着世界坐标系的坐标轴旋转的

4、静态欧拉角和动态欧拉角

        前面说到的旋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值