Unity第一视角MouseLook源码分析
来源:互联网 发布:美国离线导航软件 编辑:程序博客网 时间:2024/06/08 16:16
摘要:
本文对Unity第一视角MouseLook源码继续深入分析,并引用一些四元数的数学概念来阐述代码工作原理。
导入资源:
在Project栏导入Characters,其中里面包含FirstPersonCharacters相关资源。
源码文件:
Characters->FirstPersonCharacters->script->MouseLook.cs
源码附注释:
public class MouseLook { public float XSensitivity = 2f;//X灵敏度 public float YSensitivity = 2f;//Y灵敏度 public bool clampVerticalRotation = true;//是否夹紧视角 public float MinimumX = -90F;//绕x轴旋转角度,低头极限 public float MaximumX = 90F;//绕x轴旋转角度,抬头极限 public bool smooth;//是否开启平滑视角过度 public float smoothTime = 5f;//平滑时间 private Quaternion m_CharacterTargetRot;//角色旋转的目标角度(角色旋转会带动相机旋转) private Quaternion m_CameraTargetRot;//相机旋转的目标角度(相机旋转不会带动角色旋转) public void Init(Transform character, Transform camera) { m_CharacterTargetRot = character.localRotation; m_CameraTargetRot = camera.localRotation; } public void LookRotation(Transform character, Transform camera) { float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity; float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity;//请注意,mouseX转换为y轴旋转,mouseY转换为x轴旋转 m_CharacterTargetRot *= Quaternion.Euler (0f, yRot, 0f);//左右视角 m_CameraTargetRot *= Quaternion.Euler (-xRot, 0f, 0f);//上下视角 if(clampVerticalRotation)//夹紧x轴旋转角度[-90,90],亦即上下视角,默认开启 m_CameraTargetRot = ClampRotationAroundXAxis (m_CameraTargetRot); if(smooth) { //划动视角时,是否开启平滑模式,slerp进行插值,默认关闭 character.localRotation = Quaternion.Slerp (character.localRotation, m_CharacterTargetRot, smoothTime * Time.deltaTime); camera.localRotation = Quaternion.Slerp (camera.localRotation, m_CameraTargetRot, smoothTime * Time.deltaTime); } else { character.localRotation = m_CharacterTargetRot; camera.localRotation = m_CameraTargetRot; } } Quaternion ClampRotationAroundXAxis(Quaternion q) { q.x /= q.w; q.y /= q.w; q.z /= q.w; q.w = 1.0f; //见下文对四元数的解释 //Rad2Deg弧度转度,Deg2Rad度转弧度 float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan (q.x); //Mathf.Clamp将数值归入到指定区间,如数值已在区间内无变化,若数值超出区间则就近归入到区间端点。 angleX = Mathf.Clamp (angleX, MinimumX, MaximumX); //Tan为三角函数 q.x = Mathf.Tan (0.5f * Mathf.Deg2Rad * angleX); return q; } }
四元数:
【Unity技巧】四元数(Quaternion)和旋转
unity 提供四元数类,同时说明如果你不熟系四元数千万不要修改x,y,z,w。
在ClampRotationAroundXAxis对四元数x,y,z,w进行了修改,如果不了解四元数,则无法理解这段代码。下面这篇文章让我们大致理解了什么是四元数。我们不是研究数学的,所以没必要深究,只要有助于我们理解这段代码即可。
文章中,有此片段:
给定一个欧拉旋转(X, Y, Z)(即分别绕x轴、y轴和z轴旋转X、Y、Z度),则对应的四元数为
x = sin(Y/2)sin(Z/2)cos(X/2)+cos(Y/2)cos(Z/2)sin(X/2)
y = sin(Y/2)cos(Z/2)cos(X/2)+cos(Y/2)sin(Z/2)sin(X/2)
z = cos(Y/2)sin(Z/2)cos(X/2)-sin(Y/2)cos(Z/2)sin(X/2)
w = cos(Y/2)cos(Z/2)cos(X/2)-sin(Y/2)sin(Z/2)sin(X/2)
根据此公式,我们得知q.x/q.w =tanθ/2,
我们将θ/2的弧度角转换为θ度角,float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan (q.x);
把这个角夹紧在[-90,90],Mathf.Clamp (angleX, MinimumX, MaximumX);
再把这个角,转换为四元数所需要的形式。请注意,在此段代码q.y和q.z始终为0,并且,因为q.w=1所以x便可直接赋值为tanθ/2。
如果q.w赋值为cosθ/2,那么q.x则需要赋值为sinθ/2,依照四元数关系这两个四元数模不一样,定义提及只有模为1的四元数才可以用于旋转。
这两个四元数(sinθ/2,0,0,cosθ/2),(tanθ/2,0,0,1)应该可以代表同一旋转角度,只不过第二个四元数模不为1需要转换。
限于本人水平,如果错误,请指正,谢谢。
- Unity第一视角MouseLook源码分析
- unity第一人称视角mouselook分析
- Unity 视角 第一人称脚本 MouseLook
- unity第三人称视角分析
- [Unity&]缺少引用空间MouseLook 的解决办法
- unity实现第一视角的跟随物体运动
- Unity基础包 FirstPersonController下的MouseLook 脚本研究
- Unity基础包 FirstPersonController下的MouseLook 脚本研究
- unity GearVr 摄像机视角
- Unity固定视角摄像机
- 第一视角射击游戏
- Unity之-----背后视角摄像机
- 【MySql源码分析】第一课
- CodeIgniter 源码分析第一弹
- LeakCanary源码分析第一讲
- war3第一视角合集
- 摄像机 第一视角和第三视角的切换
- [unity for android]第三人称视角研究
- no sigar-x86-winnt.dll in java.library.path
- ubuntu 14.04 LTS 安装webbentch压力测试工具
- logistic回归和用最大似然估计选取CostFunction
- PyCharm 教程(五)断点 调试
- AlarmManager
- Unity第一视角MouseLook源码分析
- 2014年黑龙江省应用技术研究与开发计划重大项目招标公告
- 城里城外
- DownloadManager
- wpa_supplicant daemon server & GUI test message
- 练车经验
- 破解WPA/WPA2 for Non-Dictionary Passphrase
- iOS - self & super 理解的关键点
- Cocos2d-x Lua中实例:特效演示