当前位置:   article > 正文

U3D问题总结(实时更新,建议收藏)_unity 如何用空对象改变坐标轴

unity 如何用空对象改变坐标轴

1,自身坐标系和世界坐标系

场景中的物体有两个坐标系,一个是自身坐标系,也叫本地坐标系,另外一个是世界坐标系

比如说我们在场景中创建一个cube,把它的参数reset。在Scene窗口那里

 红色框框那里就可以修改物体所在的坐标系

 Global就是世界坐标系,Local就是自身坐标系,我们当前选择的是自身坐标系,我们切换世界坐标系看看,发现cube的坐标轴没有任何变化。但是我们回到自身坐标系,我们将cube的x轴的旋转值设置成90,然后再切换世界坐标系就会发现,两个坐标系的坐标轴不一样。

这是因为世界坐标系不会变,x轴指哪就一直指哪,但是自身坐标系不一样,自身坐标系会随着自身的旋转而改变坐标系。

2,Transform.Translate

作用:将物体沿某一方向移动

演示

在场景中添加一个cube,然后创建一个C#脚本,将这个脚本拖给Main Camera,然后在脚本里添加下面代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class NewBehaviourScript : MonoBehaviour
  5. {
  6. public GameObject cube;
  7. private void Update()
  8. {
  9. cube.transform.Translate(new Vector3(0,1,0));
  10. }
  11. }

意思就是将这个cube沿着自身坐标系的y轴方向移动 

3,Unity中的旋转和方向

官方手册:Rotation and orientation in Unity - Unity 手册 

简单说一下就是unity中使用欧拉角和四元数来表示旋转和方向,其实大部分三维软件包括ue也用的这个。

简而言之,欧拉角就是比较直观的,属性面板那个的坐标下的rotation的三个轴就是欧拉角,不过欧拉角会出现万向节锁定的问题,所以内部用四元数来表示旋转和方向。

也就是说外面使用的是欧拉角,便于用户操作,内部使用的四元数,四元数稳定且高效,不会出现万向节锁定的问题。

我们在脚本中打印transform下的rotation发现就是一个四元数,这和面板上的三个轴不一样,面板上使用的就是欧拉角,内部使用的是四元数

4,欧拉角和四元数的转换

5,Mathf.SmoothDamp

SmoothDamp(平滑阻尼)函数用于平滑缓冲移动,多用于摄像头移动 

如果作用在移动中上,表现为慢慢减速到目标位置,类似这个函数还有vector3.Lerp插值函数,不过Lerp的粗暴的插值,而SmoothDamp则更smooth,一般用于摄像头移动

函数原型

public static float SmoothDamp(float current, float target, ref float currentVelocity, float smoothTime, float maxSpeed);

current:需要改变的参数的当前值

target:目标值

currentVelocity:函数所作用目标移动的最大速度,这个所谓的速度,表征的是该物体每秒移动Unity内多少个单位。需要注意的是:首先在传参时记得加上ref关键字,因为SmoothDamp的内部会更新这个值并且传递出来,其次,这个传入的参数的生命周期需要比SmoothDamp长,因为SmoothDamp内部会根据上一次计算得到的速度,去更新下一次的位置,简单的方法就是把这个传入的参数设为全局变量。 

smoothTime:平滑的时间

maxSpeed:最大速度(可不传)

6,Vector3.Lerp

lerp线性插值,和smoothDamp类似

函数原型

 a:插值的起始值

b:插值的结束值

t:插值距离,范围是[0,1]

比如t为0.5的话,那么返回的就是a到b的中间值,t为0.3的话,返回的就是a到b大小的30%的值

t为0的话返回就是a,t为1的话返回就是b

t才是决定返回位置的关键参数

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/140684
推荐阅读
相关标签
  

闽ICP备14008679号