在Unity中通过触摸屏幕实现模型的旋转和缩放

来源:互联网 发布:ubuntu离线安装mysql 编辑:程序博客网 时间:2024/05/21 09:21

在项目中,我们有时要通过触摸屏幕来实现模型的放大缩小以及旋转。这个在AR的制作中是非常常见的,所以下面我们来实现这样的功能。

using UnityEngine;using System.Collections;public class ScaleAndRotate : MonoBehaviour {    private Touch oldTouch1;  //上次触摸点1(手指1)    private Touch oldTouch2;  //上次触摸点2(手指2)    void Update()    {        //没有触摸,就是触摸点为0        if (Input.touchCount <= 0)        {            return;        }        //单点触摸, 水平上下旋转        if (1 == Input.touchCount)        {            Touch touch = Input.GetTouch(0);            Vector2 deltaPos = touch.deltaPosition;            transform.Rotate(Vector3.down * deltaPos.x, Space.World);//绕Y轴进行旋转            //transform.Rotate(Vector3.right * deltaPos.y, Space.World);//绕X轴进行旋转,下面我们还可以写绕Z轴进行旋转        }        //多点触摸, 放大缩小        Touch newTouch1 = Input.GetTouch(0);        Touch newTouch2 = Input.GetTouch(1);        //第2点刚开始接触屏幕, 只记录,不做处理        if (newTouch2.phase == TouchPhase.Began)        {            oldTouch2 = newTouch2;            oldTouch1 = newTouch1;            return;        }        //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型        float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);        float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);        //两个距离之差,为正表示放大手势, 为负表示缩小手势        float offset = newDistance - oldDistance;        //放大因子, 一个像素按 0.01倍来算(100可调整)        float scaleFactor = offset / 100f;        Vector3 localScale = transform.localScale;        Vector3 scale = new Vector3(localScale.x + scaleFactor,                                    localScale.y + scaleFactor,                                    localScale.z + scaleFactor);        //在什么情况下进行缩放        if (scale.x >= 0.05f && scale.y >=0.05f && scale.z >= 0.05f)        {            transform.localScale = scale;        }        //记住最新的触摸点,下次使用        oldTouch1 = newTouch1;        oldTouch2 = newTouch2;    }}

方法2:
// /**//  *        ┏┓   ┏┓+ +//  *       ┏┛┻━━━┛┻┓ + +//  *       ┃       ┃  //  *       ┃   ━   ┃ ++ + + +//  *       ████━████ ┃+//  *       ┃       ┃ +//  *       ┃   ┻   ┃//  *       ┃       ┃ + +//  *       ┗━┓   ┏━┛//  *         ┃   ┃           //  *         ┃   ┃ + + + +//  *         ┃   ┃    Code is far away from bug with the animal protecting       //  *         ┃   ┃ +     神兽保佑,代码无bug  //  *         ┃   ┃//  *         ┃   ┃  +         //  *         ┃    ┗━━━┓ + +//  *         ┃        ┣┓//  *         ┃        ┏┛//  *         ┗┓┓┏━┳┓┏┛ + + + +//  *          ┃┫┫ ┃┫┫//  *          ┗┻┛ ┗┻┛+ + + +//  *//  *//  * ━━━━━━感觉萌萌哒━━━━━━//  * //  * 说明://  *   此脚本用于手势控制物体的旋转和缩放//  * 文件名:UserInputHandler.cs//  * //  *//  */#pragma warning disable 0162using UnityEngine;/// <summary>/// 此脚本用于手势控制物体的旋转和缩放/// </summary>public class UserInputHandler : MonoBehaviour{#if UNITY_IOS ||  UNITY_IPHONE      public float horizontalSpeed = 0.2f; // 水平和垂直旋转的速度#endif#if UNITY_ANDROID    public float horizontalSpeed = 2.5f; // 水平和垂直旋转的速度#endif    public float minScale = 0.6f; // 最小缩放比例    public float maxScale = 1.5f; // 最大缩放比例    private bool m_isOpenScaleGesture = true;    /// <summary>    /// 是否打开缩放手势    /// </summary>    public bool IsOpenScaleGesture    {        get { return m_isOpenScaleGesture; }        set { m_isOpenScaleGesture = value; }    }    private bool m_isOpenRotationGesture = true;    /// <summary>    /// 是否打开 旋转手势    /// </summary>    public bool IsOpenRotationGesture    {        get { return m_isOpenRotationGesture; }        set { m_isOpenRotationGesture = value; }    }    private Vector2 oldPos, newPos; // 此次点击和上次点击的位置    private Touch oldTouch1, oldTouch2; // 此次点击和上次点击的触摸对象    void Update()    {        //if (Stage.isTouchOnUI)        //{        //    return;        //}        // 若是单点移动触控则进行旋转        if (IsOpenRotationGesture && Input.touchCount == 1)        {            {                if (Input.GetTouch(0).phase == TouchPhase.Moved)                {                    Vector2 deltaPosition = Input.GetTouch(0).deltaPosition;                    if (Mathf.Abs(deltaPosition.x) > 0.1f)                    {                        transform.Rotate(transform.up, -(deltaPosition.x * horizontalSpeed), Space.World);                    }                }            }        }        else if (IsOpenScaleGesture && Input.touchCount == 2)        {            //多点触摸, 放大缩小              Touch newTouch1 = Input.GetTouch(0);            Touch newTouch2 = Input.GetTouch(1);            //第2点刚开始接触屏幕, 只记录,不做处理              if (newTouch2.phase == TouchPhase.Began)            {                oldTouch2 = newTouch2;                oldTouch1 = newTouch1;                return;            }            //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型              float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);            float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);            //两个距离之差,为正表示放大手势, 为负表示缩小手势              float offset = newDistance - oldDistance;            //放大因子, 一个像素按 0.01倍来算(100可调整)              float scaleFactor = offset / 250f;            Vector3 localScale = transform.localScale;            Vector3 scale = new Vector3(localScale.x + scaleFactor,                                        localScale.y + scaleFactor,                                        localScale.z + scaleFactor);            //  限制缩放在一定的范围内            if (scale.x >= minScale && scale.x <= maxScale)            {                transform.localScale = scale;            }            //记住最新的触摸点,下次使用              oldTouch1 = newTouch1;            oldTouch2 = newTouch2;        }    }    //void OnGUI()    //{    //    if (GUILayout.Button(" 速度+++", GUILayout.Width(200), GUILayout.Height(200)))    //    {    //        horizontalSpeed += 0.1f;    //    }    //    if (GUILayout.Button(" 速度---", GUILayout.Width(200), GUILayout.Height(200)))    //    {    //        horizontalSpeed -= 0.1f;    //        if (horizontalSpeed <= 0)    //        {    //            horizontalSpeed = 0.1f;    //        }    //    }    //    GUILayout.Label("当前速度  " + horizontalSpeed);    //}}


好了,这样我们就可以通过单指来进行旋转,双指来进行模型的缩放,如果我们在手势判断上有改变的话。可以依据以上的进行修改。


阅读全文
0 0
原创粉丝点击