unity 五种旋转方式的区别

本文详细介绍了Unity中五种旋转方式:localEulerAngles、eulerAngles、rotation、localRotation和Rotate。通过实例分析了它们在世界坐标系和局部坐标系下的差异,特别是作为子物体时的旋转表现。总结了如何根据需求选择合适的旋转方法。

[五种旋转方式localEulerAngles、eulerAngles、rotation、localRotation和Rotate]
1.1 transform.localEulerAngles
使用localEulerAngles进行旋转的时候,我们要使用transform.localEulerAngles = new Vector3(x, y,z); 其中,new Vector(x,y,z)为游戏物体最终旋转到的目标角度,x.y,z的值分别都是以0为基准,假设游戏物体的初始角度为(x1,y1,z1),则游戏物体从(x1,y1,z1)旋转到(x,y,z),但是是以父游戏物体的坐标系为参考(自己是顶级游戏物体除外)

举个例子:
假如游戏物体A,B,都没有父游戏物体,B初始旋转角度为(0,0,0),A的初始旋转角度为(0,0,45),编写脚本并把它挂载到B上,脚本编写如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test2 : MonoBehaviour {
    private float agent;
	void Start () {
        agent = 0f;
	}
	// Update is called once per frame
	void Update () {
        agent += Time.deltaTime*50;
        transform.localEulerAngles= new Vector3(0f,agent,0f);
	}
}

这时,在程序还在跑着的时候,把B拽到A下,作为A的子游戏物体,这时,B的旋转角度为(0f,agent,0f),结果证明也是这样,如下动图:

结论:通过
transform.localEulerAngles= new Vector3(0f,agent,0f);
设置的角度是相对角度(类似于相对路径)

1.2 transform.eulerAngles
transform.eulerAngles= new Vector3(x,y,z)

new Vector(x,y,z)为游戏物体最终旋转到的目标角度,x.y,z的值分别都是以0为基准,假设游戏物体的初始角度为(x1,y1,z1),则游戏物体从(x1,y1,z1)旋转到(x,y,z),,同时也以世界坐标系为参考,而不是以父级游戏物体的坐标系为准。
举个例子:
假如游戏物体A,B,都没有父游戏物体,B初始旋转角度为(0,0,0),A的初始旋转角度为(0,0,45),编写脚本并把它挂载到B上,脚本编写如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test2 : MonoBehaviour {
    private float agent;
	void Start () {
        agent = 0f;
	}
	// Update is called once per frame
	void Update () {
        agent += Time.deltaTime*50;
        transform.eulerAngles= new Vector3(0f,agent,0f);
	}
}

这时,在程序还在跑着的时候,把B拽到A下,作为A的子游戏物体,这时,你猜,B的旋转角度是如何变化?
如果是以父级游戏物体的坐标系为准为准的话,那么B的旋转角度为(0f,agent,0f)

结论:通过
transform.eulerAngles= new Vector3(x,y,z)
设置的角度是绝对角度(类似于绝对路径)
但是,事实证明,B的旋转角度不仅仅是y轴的值变,连x轴、z轴的值都在变,如下动图:

2.1 transform.rotation
//将欧拉旋转角转换为四元素旋转角
Quaternion rotation= Quaternion.Euler(new Vector3(x, y,z));
Transform.rotation=rotation;

new Vector(x,y,z)为游戏物体最终旋转到的目标角度,x.y,z的值分别都是以0为基准,假设游戏物体的初始角度为(x1,y1,z1),则游戏物体从(x1,y1,z1)旋转到(x,y,z),,同时也以世界坐标系为参考,而不是以父级游戏物体的坐标系为准。
举个例子:
假如游戏物体A,B,都没有父游戏物体,B初始旋转角度为(0,0,45),A的初始旋转角度为(0,0,45),编写脚本并把它挂载到B上,脚本编写如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test2 : MonoBehaviour {
    private float agent;
	void Start () {
        agent = 0f;
	}
	// Update is called once per frame
	void Update () {
        agent += Time.deltaTime*50;
        transform.rotation = Quaternion.Euler(new Vector3(0f,agent,45f));
	}
}

这时,在程序还在跑着的时候,把B拽到A下,作为A的子游戏物体,这时,你猜,B的旋转角度是如何变化?
如果是以父级游戏物体的坐标系为准为准的话,那么B的旋转角度为(0,agent,45f)
但是,事实证明,B的旋转角度不仅仅是y轴的值变,连x轴、z轴的值都在变,如下动图:

结论:通过
Quaternion rotation= Quaternion.Euler(new Vector3(x, y,z));
Transform.rotation=rotation;
设置的角度是绝对角度(类似于绝对路径)

2.2 transform.localRotation
类似于localEulerAngles,不再叙述

3 transform.Rotate(参数)
transform.Rotate(x,y,z):以自身坐标系为参考,而不是世界坐标系,分别以x度y度z度绕X轴、Y轴、Z轴匀速旋转

transform.Rotate(轴,Space.Self):以自身坐标系为参考
Transform.Rotate(轴,Space.World):以世界坐标系为参考

需求:我想拿到下面图中游戏物体B的相对与游戏物体A的三维坐标 (0,20,0)
在这里插入图片描述
在这里插入图片描述
只需通过 游戏物体B实例对象. transform.localEulerAngles 即可拿到,打印输出如下:
在这里插入图片描述
但是当B的坐标出现有负数呢?如下图:
在这里插入图片描述
打印输出为:
在这里插入图片描述
不知你有没有看出点什么?
是不是有这样的规律:
360+(-10)=350,360+20=380(即为20),360+0=360(即为0)

当游戏物体B不再是A的子物体时,如下图:
在这里插入图片描述
是否还能通过这种方式获取呢?
答案是肯定的,如下图:
在这里插入图片描述

作者:zxy2847225301
来源:优快云
原文:https://blog.youkuaiyun.com/zxy13826134783/article/details/79461816
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值