首先我们来参考一下四元数在Unity中的应用:
unity 3D 详解Quaternion类(一)
unity3D 详解Quaternion类(二)
四元数quaternion的变换比较复杂,但是在unity中已经给我们写好了相应的函数实现对transform的操作。
在最近的一个项目中,遇到了一个单手指滑动手机屏幕实现对模型的一个旋转操作,在尝试了各种unity中的旋转函数之后都没能够达到想要的效果之后,我选择了用Quaternion.AngleAxis的函数来实现旋转的操作效果。
首先我们来分析一下Quaternion.AngleAxis(angle,axis),参数angle和axis代表了物体的旋转角度和旋转轴心。如下图:红色箭头方向代表物体所围绕的旋转轴,旋转角度可以是自定义的。
接下来,我们就要做两件事情,确定axis和计算angle。在这个项目中,我们是根据单个手指在手机屏幕上滑动,我们通过记录滑动的距离,X方向的增量,以及Y轴方向的增量来为后面计算axis和angle打下基础。unity的Input函数有GetTouch这个函数,我们只需要调用这个函数的相关方法就可以实现需求。
现在,我们在unity中新建一个场景,在场景中新建一个立方块。
注意立方块的世界坐标轴,Z轴的朝向应该是朝着摄像机的。根据之前对四元数脚本的分析,立方体的旋转脚本为:
Gesture.cs:
1 using UnityEngine; 2 using System.Collections; 3 4 public class gesture : MonoBehaviour { 5 public Transform Cube; 6 private float radius = 1080; 7 private Vector3 originalDir = new Vector3(0f,0f,1080f); 8 private Vector3 CenterPos = new Vector3(0, 0, 0); 9 private Vector2 startPos; 10 private Vector2 tempPos; 11 private Vector3 tempVec; 12 private Vector3 normalAxis; 13 private float angle; 14 // Use this for initialization 15 void Start () { 16 Cube = GameObject.Find("Cube").transform; 17 } 18 19 // Update is called once per frame 20 void Update () { 21 if (Input.touchCount == 1) 22 { 23 //Vector2 startPos = Input.compositionCursorPos; 24 if (Input.GetTouch(0).phase == TouchPhase.Began) 25 { 26 startPos = Input.GetTouch(