之前实现的是相机的360度旋转,用的是LocalEulerAngle,这一篇文章实现用的是Quaternion.AngleAxis,这个方法将绕某个轴旋转的角度转为四元数


目前的四元数=初始的四元数*绕X轴转的四元数*绕Y轴转的四元数


理解也比较好理解,就是绕某个轴旋转的角度,转换为四元数,然后将转换后的四元数*初始的四元数=最新的四元数


using UnityEngine;using System.Collections;
using System.Collections.Generic;public class SmoothMouseLook : MonoBehaviour {public float sensitivity = 4.0f;[HideInInspector]public float sensitivityAmt = 4.0f;//actual sensitivity modified by IronSights Scriptprivate float minimumX = -360f;private float maximumX = 360f;private float minimumY = -85f;private float maximumY = 85f;[HideInInspector]public float rotationX = 0.0f;[HideInInspector]public float rotationY = 0.0f;[HideInInspector]public float inputY = 0.0f;public float smoothSpeed = 0.35f;private Quaternion originalRotation;private Transform myTransform;[HideInInspector]public float recoilX;//non recovering recoil amount managed by WeaponKick function of WeaponBehavior.cs[HideInInspector]public float recoilY;//non recovering recoil amount managed by WeaponKick function of WeaponBehavior.csvoid Start(){         if (rigidbody){rigidbody.freezeRotation = true;}myTransform = transform;//cache transform for efficiencyoriginalRotation = myTransform.localRotation;//sync the initial rotation of the main camera to the y rotation set in editorVector3 tempRotation = new Vector3(0,Camera.main.transform.eulerAngles.y,0);originalRotation.eulerAngles = tempRotation;sensitivityAmt = sensitivity;//initialize sensitivity amount from var set by player// Hide the cursorScreen.showCursor = false;}void Update(){if(Time.timeScale > 0 && Time.deltaTime > 0){//allow pausing by setting timescale to 0//Hide the cursorScreen.lockCursor = true;Screen.showCursor = false;// Read the mouse input axisrotationX += Input.GetAxisRaw("Mouse X") * sensitivityAmt * Time.timeScale;//lower sensitivity at slower time settingsrotationY += Input.GetAxisRaw("Mouse Y") * sensitivityAmt * Time.timeScale;//reset vertical recoilY value if it would exceed maximumY amount if(maximumY - Input.GetAxisRaw("Mouse Y") * sensitivityAmt * Time.timeScale < recoilY){rotationY += recoilY;recoilY = 0.0f;  }//reset horizontal recoilX value if it would exceed maximumX amount if(maximumX - Input.GetAxisRaw("Mouse X") * sensitivityAmt * Time.timeScale < recoilX){rotationX += recoilX;recoilX = 0.0f;    }rotationX = ClampAngle (rotationX, minimumX, maximumX);rotationY = ClampAngle (rotationY, minimumY - recoilY, maximumY - recoilY);inputY = rotationY + recoilY;//set public inputY value for use in other scriptsQuaternion xQuaternion = Quaternion.AngleAxis (rotationX + recoilX, Vector3.up);Quaternion yQuaternion = Quaternion.AngleAxis (rotationY + recoilY, -Vector3.right);//smooth the mouse inputmyTransform.rotation = Quaternion.Slerp(myTransform.rotation , originalRotation * xQuaternion * yQuaternion, smoothSpeed * Time.smoothDeltaTime * 60 / Time.timeScale);//lock mouselook roll to prevent gun rotating with fast mouse movementsmyTransform.rotation = Quaternion.Euler(myTransform.rotation.eulerAngles.x, myTransform.rotation.eulerAngles.y, 0.0f);}else{//Show the cursorScreen.lockCursor = false;Screen.showCursor = true;    }}//function used to limit anglespublic static float ClampAngle (float angle, float min, float max){angle = angle % 360;if((angle >= -360F) && (angle <= 360F)){if(angle < -360F){angle += 360F;}if(angle > 360F){angle -= 360F;}         }return Mathf.Clamp (angle, min, max);}}


FR:海涛高软(Hunk Xu)
QQ技术交流群:386476712

Unity鼠标控制相机上下左右环视360度旋转(Quaternion.AngleAxis)相关推荐

  1. Unity 基础 之 鼠标控制 相机(摄像机Camera)的旋转,移动和 fov 的简单使用整理

    Unity 基础 之 鼠标控制 相机(摄像机Camera)的旋转,移动和 fov 的简单使用整理 目录 Unity 基础 之 鼠标控制 相机(摄像机Camera)的旋转,移动和 fov 的简单使用整理 ...

  2. Unity 在zSpace上使用鼠标控制相机旋转和鼠标指引式放大缩小,在触屏上手势位置为中心放大缩小

    在zSpace上使用鼠标控制相机旋转和鼠标指引式放大缩小,在触屏上手势位置为中心放大缩小 鼠标和触屏的操作 下面展示一些 内联代码片. using System; using System.Colle ...

  3. Unity3d实现鼠标控制相机绕物体旋转(带阻尼)

    Unity3d实现鼠标控制相机绕物体旋转(带阻尼) 本来想的是用四元数实现球性插值实现阻尼效果,但是不知道四元数怎么绕定点旋转.因此用速度衰减的方法进行实现. 1.实现鼠标控制相机带阻尼旋转 2.实现 ...

  4. Cesium 键盘鼠标控制相机漫游(源码+原理讲解)

    Cesium 键盘鼠标控制相机漫游(源码+原理讲解) 在各大博客平台上,Cesium使用键盘控制相机漫游的源码已经有不少人贴出源码,本人在浏览这些源码的过程中发现大家采用的方式基本一致,大部分代码都是 ...

  5. 图像scale与相机参数_基于Ladybug全景相机图像的360度全方位测距算法

    基于Ladybug全景相机图像的360度全方位测距算法 [专利摘要]本发明公开了一种基于Ladybug全景相机图像的360度全方位测距算法,它涉及计算机视觉领域中的图像测距[技术领域].其方法步骤:读 ...

  6. Unity鼠标控制摄像机 围绕物体旋转

    Unity鼠标控制摄像机 围绕物体旋转 角度范围判定 // An highlighted block using UnityEngine;public class CameraCtrl : MonoB ...

  7. 【Blender】使用Blender渲染一段360度旋转的动画

    目录 一.前言 二.方法描述 三.渲染设置 四.结果 一.前言 本文主要讲述了如何使用Blender渲染一段物体360度旋转的动画. 渲染好的效果如下: 二.方法描述 第一步:shift+A,我们在B ...

  8. 【精心挑选】10款基于 jQuery 的图片360度旋转插件

    之前的文章向大家分享了实现网站功能的各种优秀的 jQuery 插件,今天这篇文章向大家推荐10款基于 jQuery 的图片360度旋转插件,同时还有非常详细的制作教程可以学习和参考.图片旋转展示是一种 ...

  9. 旋转矩阵中6保6_40岁阿姨发明新型手推车,可以360度旋转,干活效率提升6倍

    科技,其实很有趣!大家好,欢迎收看本期木易机械 40岁阿姨发明新型手推车,能够360度旋转,干活效率提升6倍 科技的发展是我们有目共睹的,不仅是那些震惊世界的发明,就在我们的日常生活中,也有很多的小发 ...

  10. 360度旋转图片小特效

    现在,在这个网络发达的时代,一些电子商务公司,需要将自己线上的产品给买家或用户看,为了能让用户了解的更全面,那么把一个物件的产品要展示到方方面面,就要运用到360度旋转图片特效,因为上次有朋友叫我帮她 ...

最新文章

  1. pandas使用Categorical函数将object数据数据列转化为categorical数据列并基于categorical的因子(分类)水平排序dataframe
  2. Symantec Endpoint Protection 11 混乱的版本
  3. GRE词汇乱序版-夹生的词汇3
  4. android 多线程断点续传下载 三
  5. 语文好的人是怎么做到的?
  6. SPOJ-LCS Longest Common Substring
  7. python k线合成_在VNPY中策略中,使用分钟线合成日K线
  8. MySql学习笔记(六):扫描范围
  9. SiTime 硅晶振抖动定义和测量方法
  10. 软件过程管理课程知识点总结
  11. android 九宫格手势密码 纯代码实现
  12. matlab多元线性回归方程代码
  13. lync服务器不响应或无法联系,Lync 2013 已知问题
  14. LSH 近似最近邻查找
  15. android使用精伦身份证读卡器读身份证
  16. SAP中SD交货与WM下架功能的集成应用
  17. spark python_Python、流、SQL 有更新!耗时两年,Spark 3.0 重磅发布!
  18. 在vue项目中使用echarts中的dataset制作多维度的柱状图
  19. 8. R语言画:散点图、直方图、条形图、箱线图、小提琴图、韦恩图
  20. 数据可视化-《白蛇2:青蛇劫起》(1)

热门文章

  1. 当SaaS遇上私域流量,小牛叮当如何做好B端服务?
  2. 人生就是一场与自己的较量,社科院杜兰金融硕士项目引领你走得更远
  3. idm由于法律原因无法下载怎么办?
  4. LRU算法(有彩蛋)
  5. UDS tester之Tdrm
  6. history的使用方法
  7. 常见的域名劫持类型及如何修复
  8. Python网络之数据库
  9. 转载(吃货告诉你,PAAS、IAAS和SAAS之间的区别)
  10. 3DTools TrackballDecorator实现3D漫游