unity使用localEulerAngles、rotation和Rotate进行旋转的区别
来源:互联网 发布:软件过程管理 编辑:程序博客网 时间:2024/06/16 04:02
在学习关于旋转的脚本时,发现有几种旋转手段:localEulerAngles、rotation、Rotate,然而对于像我一样的新手来说总是会把他们搞糊涂,特此总结一下他们之间的区别。
使用localEulerAngles进行旋转的时候,我们要使用transform.localEulerAngles = new Vector3(x, y,z); 这样的语句来实现旋转操作,而实际上此条语句是给localEulerAngles赋了一个新的旋转角度值,使Gameobject以欧拉角旋转到 new Vector3(x, y,z) 这个角度位置,因此,当我们用它来进行旋转时,所传入的new Vector3(x, y,z)必须是我们想要Gameobject旋转到的最终角度,并且,其旋转的基准是其三个轴都没有旋转时的自身轴。
使用rotation进行旋转时,我们要先得到其欧拉角旋转值new Vector3(x, y,z) ,因为transform.rotation是一个四元数(Quaternion),故利用Quaternion.Euler(new Vector3(x, y,z) )将欧拉角旋转值转化为四元数旋转值,再利用transform.rotation=Quaternion.Euler(new Vector3(x, y,z) ); 将此四元数赋值给Gameobject的rotation,最终得以完成旋转。此方法和localEulerAngles类似,都是采用了以最终的角度从新给gameobject赋值并覆盖之前的旋转角度信息来完成旋转的,因此,当我们用它来进行旋转时,所传入的new Vector3(x, y,z)必须是我们想要Gameobject旋转到的最终角度,并且,其旋转的基准是世界坐标轴。
使用Rotate进行旋转时,可以直接使用transform.Rotate(x, y,z)来进行旋转,但是此种旋转是在Gameobject原有的旋转角度基础之上绕自身轴进行的,故在多轴旋转使用它时要注意自身轴随着gameobject的旋转而偏移。
以下面第三人称视角代码为例:
(1)使用localEulerAngles或者rotation进行旋转
using System.Collections;using System.Collections.Generic;using UnityEngine;public class ThirdPersonView_PlayerFollowMouse : MonoBehaviour { //选择第三人称视角载体,也可以在void start里面用target=GameObject.Find("目标名称字符串")语句来锁定载体 public GameObject Player; public float X_sensitivity = 10f;//镜头跟随鼠标x向移动灵敏度 public float Y_sensitivity = 10f;//镜头跟随鼠标y向移动灵敏度 public float MouseWheel_sensitivity = 5f;//镜头跟随鼠标滚轮灵敏度 public float MinX_rotation = 5F;//镜头绕自身x轴旋转角度,抬头极限,z轴正方向是模型运动的前方 public float MaxX_rotation = 80F;//镜头绕自身x轴旋转角度,低头极限 public float Distance = 2f;//设置镜头初始距离 float X_rotation = 0f;//镜头绕自身x轴旋转值 float Y_rotation = 0f;//镜头绕自身y轴旋转值 public float maxDistance = 10f;//镜头最大距离 public float minDistance = 0.5f;//镜头最小距离 // Use this for initializationvoid Start () {}// Update is called once per framevoid Update () { //首先设置镜头位置与角色位置一致 transform.position = Player.transform.position; //当按下鼠标右键时,镜头旋转 if (Input.GetMouseButton(1)) { //绕自身y轴旋转值,等于镜头自身绕y轴旋转的欧拉角度加上鼠标横向移动反馈乘以灵敏度的值 Y_rotation = transform.localEulerAngles.y +Input.GetAxis("Mouse X") * X_sensitivity; //绕自身x轴旋转值,等于自身的旋转值减去鼠标纵向移动反馈乘以灵敏度的值(此处的加还是减看需要,需要鼠标上划抬头,就是减,需要鼠标上划低头,就是加) X_rotation -= Input.GetAxis("Mouse Y") * Y_sensitivity; //将绕自身X轴旋转值限制在一定的范围之间 X_rotation = Mathf.Clamp(X_rotation, MinX_rotation, MaxX_rotation); //使用localEulerAngles完成角度随鼠标移动旋转 transform.localEulerAngles = new Vector3(X_rotation, Y_rotation, 0); //使用rotation完成角度随鼠标移动旋转 transform.rotation = Quaternion.Euler(new Vector3(X_rotation, Y_rotation, 0)); } setdistance();//镜头向自身后方移动一定距离与player拉开距离(注:沿自身z轴向z轴负方向移动,对于任何gameobject,其正方向都是z轴正方向) } void setdistance()//方法(函数),用于设置镜头与角色距离 { if (Distance >= minDistance && Distance <= maxDistance)//如果距离数据在最大距离和最小距离之间 { //距离等于自身减去鼠标滚轮反馈乘以灵敏度的值(此处加与减同样根据需求来定) Distance -= Input.GetAxis("Mouse ScrollWheel")*MouseWheel_sensitivity; } else if (Distance < minDistance)//若距离数据小于最小值,则等于最小值 { Distance = minDistance; } else if (Distance > maxDistance)//若距离数据大于最小值,则等于最大值 { Distance = maxDistance; } //完成镜头距离设置 transform.Translate(Vector3.back * Distance ); }}
(2)使用Rotate进行旋转
using System.Collections;using System.Collections.Generic;using UnityEngine;public class ThirdPersonView_PlayerFollowMouse : MonoBehaviour { //选择第三人称视角载体,也可以在void start里面用target=GameObject.Find("目标名称字符串")语句来锁定载体 public GameObject Player; public float X_sensitivity = 10f;//镜头跟随鼠标x向移动灵敏度 public float Y_sensitivity = 10f;//镜头跟随鼠标y向移动灵敏度 public float MouseWheel_sensitivity = 5f;//镜头跟随鼠标滚轮灵敏度 public float MinX_rotation = 5F;//镜头绕自身x轴旋转角度,抬头极限,z轴正方向是模型运动的前方 public float MaxX_rotation = 80F;//镜头绕自身x轴旋转角度,低头极限 public float Distance = 2f;//设置镜头初始距离 float X_rot= 0f;//镜头绕自身x轴旋转值 float Y_rot = 0f;//镜头绕自身y轴旋转值 public float maxDistance = 10f;//镜头最大距离 public float minDistance = 0.5f;//镜头最小距离 // Use this for initializationvoid Start () {}// Update is called once per framevoid Update () { //首先设置镜头位置与角色位置一致 transform.position = Player.transform.position; //当按下鼠标右键时,镜头旋转 if (Input.GetMouseButton(1)) { //绕自身y轴旋转值,等于鼠标横向移动反馈乘以灵敏度的值 Y_rot =Input.GetAxis("Mouse X") * X_sensitivity; //绕自身x轴旋转值,等于鼠标纵向移动反馈乘以灵敏度的值(此处的正还是负看需要,需要鼠标上划抬头,就是负,需要鼠标上划低头,就是正) X_rot = -Input.GetAxis("Mouse Y") * Y_sensitivity; //完成y轴旋转,因为rotate是在原有基础上旋转,故绕y轴旋转时不能以自身y轴为旋转轴 transform.Rotate(0, Y_rot,0,Space.World); //将绕自身X轴总的旋转值限制在一定的范围之间,当原有的旋转值加上X_rot后的值超出许可范围则不作反应,当其在许可范围内时进行旋转 if (transform.localEulerAngles.x + X_rot >= MinX_rotation && transform.localEulerAngles.x + X_rot <= MaxX_rotation) { transform.Rotate(X_rot, 0, 0, Space.Self); //完成x轴旋转 } } setdistance();//镜头向自身后方移动一定距离与player拉开距离(注:沿自身z轴向z轴负方向移动,对于任何gameobject,其正方向都是z轴正方向) } void setdistance()//方法(函数),用于设置镜头与角色距离 { if (Distance >= minDistance && Distance <= maxDistance)//如果距离数据在最大距离和最小距离之间 { //距离等于自身减去鼠标滚轮反馈乘以灵敏度的值(此处加与减同样根据需求来定) Distance -= Input.GetAxis("Mouse ScrollWheel")*MouseWheel_sensitivity; } else if (Distance < minDistance)//若距离数据小于最小值,则等于最小值 { Distance = minDistance; } else if (Distance > maxDistance)//若距离数据大于最小值,则等于最大值 { Distance = maxDistance; } //完成镜头距离设置 transform.Translate(Vector3.back * Distance ); }}
- unity使用localEulerAngles、rotation和Rotate进行旋转的区别
- unity rotate 旋转物体 限制物体旋转角度 的大坑
- 属性动画中旋转动画中rotation,rotationX和rotationY的区别
- unity 根据鼠标的移动来旋转物体Rotate
- 位图的旋转 (Bitmap Rotation)
- 浅谈Unity中的rotation和Quaternion的乘法
- 浅谈Unity中的rotation和Quaternion的乘法
- Unity 关于冻结Rotation 和 Position的选项
- 图片的旋转rotate
- Unity脚本-Rotate旋转相关知识总结
- UNITY手指接触屏幕对物体进行旋转和缩放
- 使用int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();可以获取屏幕旋转的方向
- Rotate Array 数组的旋转
- 使用unity绘制旋转的三角形
- Unity--GUI 的旋转和自适应屏幕分辨率
- Flex 中利用Matrix 类的rotate函数对图片进行旋转操作的例子
- Flex中如何利用Matrix类的rotate函数对图片进行旋转操作的例子
- unity 关于Rotation和Quaternion的一些问题(欧拉角与四元数,lerp与slerp)
- Java装饰模式
- blob图像导出
- PHP浮点运算结果出现误差原因分析及解决方案
- 关于齐次坐标的理解(经典)
- 【人性化】元素据管理模块新增序号展示
- unity使用localEulerAngles、rotation和Rotate进行旋转的区别
- Java 链表模拟栈
- 大数据平台下利用Python进行Hql并行数据跑批
- 通过读取文件向mysql表单中插入某几列数据
- 函数
- Lottie动画教程
- P287 8.8
- 三、springboot项目的简单使用之:JPA使用操作数据库
- CentOS 7 系列(一)系统服务 systemd