Unity角度与旋转(四元数与欧拉角)

Unity⾓度与旋转(四元数与欧拉⾓)
在Unity中,⾓度与旋转是⼀个⽐较复杂的事情,其实现⽅式也是有很多,但是使⽤的规则是⽐较复杂的,所以需要选择对应的⽅式来实现需要的效果
⼀、Unity⾓度的表⽰⽅式
尼龙套管在Unity中表⽰⾓度的⽅式主要有两种,四元数与欧拉⾓,两者的表⽰⽅式有很⼤的不同,需要深刻理解两者,才能更好的应⽤:
四元数(Quaternion):
四元数可⽤于表⽰GameObject的⽅向或旋转。该表⽰法内部包含四个数字(在Unity中称为x,y,z和w),但是这些数字并不表⽰⾓度或轴,因此通常不需要直接访问它们。除⾮您对四元数的数学特别感兴趣,否则您只真正需要知道四元数表⽰3D空间中的旋转,并且通常不需要知道或修改x,y和z属性
欧拉⾓(EulerAngles):
欧拉⾓相对于四元数更加直观,可以直接看到旋转的⾓度,欧拉⾓的取值范围在0到360度,我们通常对于具体的⾓度的旋转使⽤欧拉加是简单⽅便的⼀种⽅式。
⼆、检查器(Inspector)⾯板Rotation胡和生简介
在我们创建⼀个3D物体时,Transfrom组件上就会有Rotation这个属性,Untiy官⽅⼿册解释为围绕X、Y或者Z轴进⾏的旋转,当我们
在Sence⾯板对物体进⾏旋转,同样就会在Transform组件在看到数字的变化。反之,我们在⾯板调整数字,同样Sence窗⼝物体也会做出旋转。
但是当我们在脚本调⽤Rotation并输出,Debug输出发现与Tansform组件中显⽰的数字并不相同,⽽是⼀个四元数,并且每个数字都是从-1到1,这是为什么呢。其实Rotation并不是和检查⾯板显⽰的那样,Rotation是⼀个四元数,⽽其数值的正负值往往代表的是旋转⽅向,⽽其数值⼤⼩0到1则对应0到180度的对应:
所以说,与其说在Transform⾯板Rotation是⼀个四元数,不如将其理解为欧拉⾓,这样便于直观的使⽤⾓度。
Rotate
持续旋转是⽐较常⽤的旋转⽅式,不注重旋转⾓度,更注重旋转的速度,⽐如车轮旋转、摩天轮旋转等等,这样的可以使
⽤transform.Rotate()来完成。⽽Rotate()就相当于获取⼀个旋转速度
使⽤⽅式:
public void Rotate(Vector3 eulers, Space relativeTo = Space.Self);
eulers:旋转⾓度的三维数
Rotate:
使⽤Transform.Rotate以多种⽅式旋转GameObject。旋转通常以欧拉⾓⽽不是四元数提供
Rotate将Vector3参数作为欧拉⾓。第⼆个参数是旋转轴,可以将其设置为局部轴(Space.Self)或全局轴(Space.World)。旋转是欧拉量
具体使⽤⽅法的⼏种案例:
//1,相对于世界坐标
transform.Rotate(Vector3.left, Space.World);
//2,相对于局部坐标,也就是⾃⾝坐标
transform.Rotate(Vector3.forward, Space.Self);
//3,基本⽤法
float speed =1f;
Vector3 v3 =new Vector3(10,10,10);
transform.Rotate(v3*speed*Time.deltaTime);
四,⾓度转换到⽬标⾓度
eulerAngles:
Transform.eulerAngles表⽰世界空间中的旋转。在检查器中查看GameObject的旋转时,您可能会看到与此属性中存储的⾓度值不同的⾓度值。这是因为Inspector显⽰本地旋转,可以使⽤Transform.localEulerAngles来查看本地的⾓度显⽰。
关于Transform.eulerAngles
最需要注意的⼀点是欧拉⾓的读取数值是介于0到360度的,所以⽆论读写,可能数值与Transform⾯板数值不同,同时,最重要的⼀点,由于这种特性,对其数值的累加可能出错
虽然累加可能出错,尽量不要尝试使⽤eulerAngles来实现旋转,但是也是可以通过累加来实现对于物体的旋转控制的,虽然累加之后并不是按照数值的递增,但是最终呈现的实物效果还是在旋转状态的:
private Vector3 v3;
private void Start()
{
v3 =new Vector3(0,0,0);
}
// Update is called once per frame
void Update()
{
v3 +=new Vector3(0,1,0);
transform.eulerAngles = v3;
Debug.Log(transform.eulerAngles);
虽然其数值与Inspector⾯板不同,使⽤起来也⽐较⿇烦,但是相对起来它是求物体转换到固定⾓度的最佳⽅法了,只是转换时要对数值敏感,选择合适的数值才能起到好的效果。
Quaternion:
Unity提供了将欧拉⾓转换为四元数的⽅法,可以使⽤Quaternion.Lerp()⽅法来完成,这是⼀种插值旋转⽅法,所以旋转速度会越来越慢,适合模拟减速效果:
rvd
Quaternion⽅法:
Quaternion.RotateTowards():插值旋转⾄与⽬标⾓度相同
Quaternion.LookRotation():插值旋转看向⽬标中华会务网
可以通过上⾯两种⽅法完成看向⽬标,或与⽬标⾓度⼀致,具体⽤法可以为:
//与target保持⼀样的⾓度
乡酒//看向⽬标
五、总结
关于⾓度是Unity中⽐较难理解的知识,需要对于⼏种⽅法有所区分,并选择合适的来应⽤,虽然有些功能另外的⽅法也可以使⽤,但是⽤
vx3起来会很复杂且难以扩展,有⼀定局限,所以应⽤前应该做好选择

本文发布于:2024-09-22 12:41:38,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/532091.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:旋转   数值   需要   欧拉   选择   效果
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议