U1L7-3——角度与旋转

Transform中的角度与旋转相关

角度相关和位置相关差不多,通过Transform​可以得到相对于世界坐标系和相对于父对象坐标系的角度,旋转也分为自转和公转

本章代码关键字

1
2
3
4
5
6
this.transform.eulerAngles        //游戏对象相对于世界坐标系的角度的属性,用欧拉角表示
this.transform.localEulerAngles //游戏对象相对于父对象的坐标系的角度的属性,用欧拉角表示,这里得到的角度范围一定是0~360,这和面板显示的角度是不同的
this.transform.rotation //游戏对象相对于世界坐标系的角度的属性,用四元数表示,注意,和面板表现形式不同!
this.transform.localRotation //游戏对象相对于父对象的坐标系的角度的属性,用四元数表示,注意,和面板表现形式不同!
this.transform.Rotate(, , ) //让游戏对象自转
this.transform.RotateAround(, , ) //让游戏对象绕某个点公转

角度相关(欧拉角)

入门阶段,先了解Inspector面板中用来表示物体角度的欧拉角,并用欧拉角来描述物体的角度与旋转(欧拉角)
要注意!脚本里的 transform.rotation​​transform.localRotation​​ 都不使用和面板一致的 欧拉角 来表示物体的角度,而是用四元数!
得到物体的欧拉角数据需要用 transform.eulerAngles​ 或者 transform.localEulerAngles
在程序里,由于欧拉角描述的旋转存在不可避免且致命的缺陷,因此实际情况下描述旋转的数一般都是四元数,之后在基础阶段的四元数里解释这一切

相对世界坐标角度(欧拉角)

1
this.transform.eulerAngles;

相对父对象角度(欧拉角)

1
this.transform.localEulerAngles;

警告!!!通过.localEulerAngles​​得到的角度不可能有负数,一定是0~360,这和面板显示的角度是不同的!!!

注意:设置角度和设置位置一样 不能单独设置xyz 要一起设置

如果我们希望改变的 角度 是面板上显示的内容 那一定是改变 相对父对象的角

1
2
3
4
5
this.transform.localEulerAngles = new Vector3 (10, 10, 10);
print(this.transform.localEulerAngles);
//如果我们希望改变的 角度 是面板上显示的内容 那一定是改变 相对父对象的角度
this.transform.eulerAngles = new Vector3(10, 10, 10);
print(this.transform.localEulerAngles);

旋转相关

可以自己计算,在这里省略,方法和位置一样,参考自己改变位置方式(自己计算位移)即可,一般都是使用API来旋转

自转

第一种自转的重载方法:

  • 第一个参数 相当于 每一帧旋转的角度
  • 第二个参数 默认不填 就是相对于自己的坐标系 进行的旋转
1
this.transform.Rotate(new Vector3(0, 10 * Time.deltaTime, 0));

相对于世界坐标系旋转

1
this.transform.Rotate(new Vector3(0, 10, 0) * Time.deltaTime, Space.World);

第二种自转的重载方法:
相对于某个轴 转多少度

  • 参数一 相对哪个轴进行转动
  • 参数二 转动的 角度 是多少
  • 参数三 默认不填 就是相对于自己的坐标系 进行旋转
    如果填 可以填写相对于 世界坐标系进行旋转
1
2
3
this.transform.Rotate(Vector3.up, 10 * Time.deltaTime);            //绕自己z轴每秒旋转10度
this.transform.Rotate(Vector3.right, 10 * Time.deltaTime); //绕自己x轴每秒旋转10度
this.transform.Rotate(Vector3.right, 10 * Time.deltaTime, Space.World); //绕世界坐标系x轴每秒旋转10度

公转

相对于某一点转(公转)

  • 参数一:绕着哪一个点 转圈圈
  • 参数二:相对于点的哪一个轴转圈
  • 参数三:转的度数 旋转速度 * 时间
1
2
this.transform.RotateAround(Vector3.zero, Vector3.up, 10 * Time.deltaTime);    //绕原点的z轴每秒旋转10度
this.transform.RotateAround(Vector3.zero, Vector3.right, 10 * Time.deltaTime); //绕原点的x轴每秒旋转10度