Unity3D中欧拉角的使用(一)

1. Unity 3d中与欧拉角有关的API
以下一共讲述了5个相关的API,前4个通过给transform组件的属性赋值实现旋转,最后1个直接使用transform组件的方法实现旋转。值得注意的是,前2个方法(包含local关键字)可以实现基于父节点坐标系的旋转。

1.transform.localRotation //transfrom组件属性
该属性表示了在父节点坐标系中的旋转情况。通常使用四元数来进行初始化。例如
xxx.transform.localrotation=Quaternion.Euler(0.0f,0.0f,0.0f);

2.transform.localEulerAngles //transform组件属性
该属性也表示了在父节点坐标系中的旋转情况,只是直接通过欧拉角来初始化。例如

xxx.transform.localEulerAngles = new Vector3 (0.0f,0.0f,0.0f);

3.transform.rotation //transform组件属性
该属性表示了在全局坐标系下的旋转情况。通常使用四元数来赋值。例如
xxx.transform.rotation=Quaternion.Euler(0.0f,0.0f,0.0f);

4.transfrom.eularAngles //transform组件属性
该属性也表示了在全局坐标系下的旋转情况,直接使用欧拉角来赋值。例如
xxx.transform.eulerAngles = new Vector3(0.0f,0.0f,0.0f);

5.transform.Rotate(Vector3 eularAngles Space relativeTo) //transform组件方法
该方法同样是使得transform实例在参考坐标系中做旋转。同时该方法也可以实现绕某向量旋转(此处不做展开)。

2.欧拉角顺规
旋转的欧拉角按照先后旋转的顺序,共有12种顺规:非对称型欧拉角X-Y-Z X-Z-Y Y-X-Z Y-Z-X Z-X-Y Z-Y-X,对称型欧拉角X-Y-X X-Z-X Y-X-Y Y-Z-Y Z-X-Z Z-Y-Z。
分享一篇讲述旋转问题比较好的博客,可以参考。

3.关于API的使用测试
以下的测试都是基于以下图像进行的,在下面的图像中,从左至右分别是Cube0、Cube1、Cube2。且Cube0是根节点,Cube1是父节点,Cube2是子节点。


##3.1 Rotate方法使用
实例3.1.1:直接使用Rotate()控制立方体绕单一坐标轴旋转。

//调整三个立方体的位置,便于观察
cube0.transform.position = new Vector3(0.0f, 0.0f, 0.0f);
cube1.transform.position = new Vector3(0.0f, 0.0f, 2.0f);
cube2.transform.position = new Vector3(0.0f, 0.0f, 4.0f);

//控制根节点Cube0绕Z轴旋转45度
cube0.transform.Rotate(new Vector3(0.0f, 0.0f, 45.0f));
1
2
3
4
5
6
7

【结果分析】与初始图像对比,三个立方体都沿着蓝色的Z轴旋转了45°。说明Rotate()f方法确实起到了控制效果,且可以带动子节点一起转动。

实例3.1.2:直接使用Rotate()控制立方体绕两个坐标轴旋转。在前面代码的基础上修改为如下代码。
cube0.transform.Rotate(0.0f,45.0f,45.0f).


【结果分析】发现此时立方体在Y轴和Z轴方向上都旋转了45°。下面增加两个实验,测试绕Y轴旋转和绕Z轴旋转的顺序。

【结果分析】该测试将原本Rotate(new Vector3(0.0f,45.0f,45.0f))分解为两个部分执行。前一张图先绕Z轴旋转45°,然后再绕y轴旋转45°。后一张图的执行顺序相反。我们发现原本旋转的结果与第二种一样,说明Rotate(new Vector3(0.0f,45.0f,45.0f))的旋转顺序是先绕Z轴旋转45°,然后绕Y旋转45°。

实例3.1.3
该实例中同时绕3个坐标轴都作一定角度的旋转。并且使用不同的参考坐标系。在之前的实例中均默认使用Space.Self为参考坐标系。下面的两个测试分别使用自身坐标系Space.Self和世界坐标系Space.World。
1)Space.Self
使用cube0.transform.Rotate(new Vector3(-30.0f, 45.0f, 45.0f), Space.Self);控制,同时将其拆分为不同的顺序执行,例如

cube0.transform.Rotate(new Vector3(0.0f, 0.0f, 45.0f), Space.Self);
cube0.transform.Rotate(new Vector3(-30.0f, 0.0f, 0.0f), Space.Self);
cube0.transform.Rotate(new Vector3(0.0f, 45.0f, 0.0f), Space.Self);  //Z-X-Y顺规
1
2
3

【结果分析】可以发现综合旋转与使用Y-X-Z的结果是一致的,**这个结论是非常让人疑惑的。**换句话说,维基百科中提到的Unity3d中顺规和此处是不相符的。

2)Space.World
使用cube0.transform.Rotate(new Vector3(-30.0f, 45.0f, 45.0f),Space.World);控制,同时也将其拆分为不同的顺序执行,例如

cube0.transform.Rotate(new Vector3(0.0f, 0.0f, 45.0f), Space.World);
cube0.transform.Rotate(new Vector3(-30.0f, 0.0f, 0.0f), Space.World);
cube0.transform.Rotate(new Vector3(0.0f, 45.0f, 0.0f), Space.World);  //Z-X-Y顺规
1
2
3

【结果分析】在使用世界坐标系作为旋转参照坐标系时,使用Z-Y-X顺规分步执行的结果与综合执行的结果相同。该Z-Y-X顺规是维基百科中给的Unity 3d的顺规。

实例3.1.4
利用Rotate()控制子节点的旋转

【结果分析】Rotate()方法针对父节点或者子节点的旋转都是一样的,都是基于全局坐标或者自身坐标系进行旋转。与父子节点没有任何联系。

利用transform属性来设置旋转的测试将在下一篇文章中进行讲解。
————————————————
版权声明:本文为CSDN博主「Dragon_Stu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/loongkingwhat/article/details/80683373

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值