1. 程式人生 > >unity 雙指觸控放大縮小鏡頭 單指平移鏡頭

unity 雙指觸控放大縮小鏡頭 單指平移鏡頭

需要全場景觀察模型和放大看模型區域性細節的時候
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMove : MonoBehaviour
{
    //攝像機距離
    public float distance = 10.0f;
    //縮放係數
    public float scaleFactor = 1f;


    public float maxDistance = 30f;
    public float minDistance = 5f;


    //記錄上一次手機觸控位置判斷使用者是在左放大還是縮小手勢
    private Vector2 oldPosition1;
    private Vector2 oldPosition2;


    private Vector2 lastSingleTouchPosition;

    private Vector3 m_CameraOffset;
    private Camera m_Camera;

    public bool useMouse = true;

    //定義攝像機可以活動的範圍
    public float xMin = -100;
    public float xMax = 100;
    public float zMin = -100;
    public float zMax = 100;

    //這個變數用來記錄單指雙指的變換
    private bool m_IsSingleFinger;

    //初始化遊戲資訊設定
    void Start()
    {
        m_Camera = this.GetComponent<Camera>();
        m_CameraOffset = m_Camera.transform.position;
    }

    void Update()
    {
        //判斷觸控數量為單點觸控
        if (Input.touchCount == 1)
        {
            if (Input.GetTouch(0).phase == TouchPhase.Began || !m_IsSingleFinger)
            {
                //在開始觸控或者從兩字手指放開回來的時候記錄一下觸控的位置
                lastSingleTouchPosition = Input.GetTouch(0).position;
            }
            if (Input.GetTouch(0).phase == TouchPhase.Moved)
            {
                MoveCamera(Input.GetTouch(0).position);
            }
            m_IsSingleFinger = true;

        }
        else if (Input.touchCount > 1)
        {
            //當從單指觸控進入多指觸控的時候,記錄一下觸控的位置
            //保證計算縮放都是從兩指手指觸碰開始的
            if (m_IsSingleFinger)
            {
                oldPosition1 = Input.GetTouch(0).position;
                oldPosition2 = Input.GetTouch(1).position;
            }

            if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
            {
                ScaleCamera();
            }

            m_IsSingleFinger = false;
        }


        //用滑鼠的
        if (useMouse)
        {
            distance -= Input.GetAxis("Mouse ScrollWheel") * scaleFactor;
            distance = Mathf.Clamp(distance, minDistance, maxDistance);
            if (Input.GetMouseButtonDown(0))
            {
                lastSingleTouchPosition = Input.mousePosition;
                Debug.Log("GetMouseButtonDown:" + lastSingleTouchPosition);
            }
            if (Input.GetMouseButton(0))
            {
                MoveCamera(Input.mousePosition);
            }
        }


    }

    /// <summary>
    /// 觸控縮放攝像頭
    /// </summary>
    private void ScaleCamera()
    {
        //計算出當前兩點觸控點的位置
        var tempPosition1 = Input.GetTouch(0).position;
        var tempPosition2 = Input.GetTouch(1).position;


        float currentTouchDistance = Vector3.Distance(tempPosition1, tempPosition2);
        float lastTouchDistance = Vector3.Distance(oldPosition1, oldPosition2);

        //計算上次和這次雙指觸控之間的距離差距
        //然後去更改攝像機的距離
        distance -= (currentTouchDistance - lastTouchDistance) * scaleFactor * Time.deltaTime;


        //把距離限制住在min和max之間
        distance = Mathf.Clamp(distance, minDistance, maxDistance);


        //備份上一次觸控點的位置,用於對比
        oldPosition1 = tempPosition1;
        oldPosition2 = tempPosition2;
    }


    //Update方法一旦呼叫結束以後進入這裡算出重置攝像機的位置
    private void LateUpdate()
    {
        var position = m_CameraOffset + m_Camera.transform.forward * -distance;
        m_Camera.transform.position = position;
    }


    private void MoveCamera(Vector3 scenePos)
    {
        Vector3 lastTouchPostion = m_Camera.ScreenToWorldPoint(new Vector3(lastSingleTouchPosition.x, lastSingleTouchPosition.y, -1));
        Vector3 currentTouchPosition = m_Camera.ScreenToWorldPoint(new Vector3(scenePos.x, scenePos.y, -1));

        Vector3 v = currentTouchPosition - lastTouchPostion;
        m_CameraOffset += new Vector3(v.x, 0, v.z) * m_Camera.transform.position.y;

        //把攝像機的位置控制在範圍內
        m_CameraOffset = new Vector3(Mathf.Clamp(m_CameraOffset.x, xMin, xMax), m_CameraOffset.y, Mathf.Clamp(m_CameraOffset.z, zMin, zMax));
        //Debug.Log(lastTouchPostion + "|" + currentTouchPosition + "|" + v);
        lastSingleTouchPosition = scenePos;
    }
}

相關推薦

unity 觸控放大縮小鏡頭 平移鏡頭

需要全場景觀察模型和放大看模型區域性細節的時候using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraMove : MonoBeha

android 自定義ImageView實現圖片手勢滑動,多點觸控放大縮小效果

首先呢,還是一貫作風,我們先來看看眾多應用中的示例:(這種效果是很常見的,可以說應用的必須品.)                             搜狐客戶端                                    百度新聞客戶端          

android 自定義ImageView實現圖片手勢滑動 多點觸控放大縮小效果

                轉自:http://blog.csdn.net/jj120522/article/details/8467810首先呢,還是一貫作風,我們先來看看眾多應用中的示例:(這種效果是很常見的,可以說應用的必須品.)                           搜狐客戶端  

WPF多點觸控放大縮小旋轉

如果要方法縮小一個canvas,或圖片: <Canvas x:Name="picShow" ClipToBounds="True" Canvas.Left="0" Canvas.Top="0" Height="509" Width="720">

unity shader 實現自由放大縮小效果

以下實現的shader程式碼: Shader "Hidden/Wave" { Properties { _MainTex ("Texture", 2D) = "white" {} _WaveWidth("Wave Width",float) = 0.5

圖片的預覽處理----多點觸控放縮/放大縮小/viewPager衝突解決

在android中,多點觸控和雙擊圖片很常用,比如朋友圈點選圖片放大兼具手勢點選滑動等;當然也有不少第三方來支援這些 比如:phtotView等; 下面來實現一個自己實現的多點操作的圖片預覽,老規矩 先上圖來展示效果: 由於是擷取模擬器的gif 所以沒有

Unity攝像機跟隨 Touch遮蔽UI 觸控控制攝像機旋轉,手勢控制放大縮小 穿牆拉近攝像機

using UnityEngine; using System.Collections; using UnityEngine.EventSystems; using UnityEngine.UI; using UnityEngine.PostProcessing; using

unity控制相機實現旋轉縮放——觸屏版(控制旋轉,結束有慣性滑動,控制縮放,根據手指間距離變化程度控制縮放程度)

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour {     public float pinch

地圖放大縮小,以兩中間的點為錨點

地圖放大縮小,以兩指中間的點為錨點  該程式碼使用外掛Easy Touch ,DoTween using DG.Tweening; using UnityEngine; using HedgehogTeam.EasyTouch; public class

VideoView可放大小的視訊播放研究

實際上,VideoView播放和可縮放之間沒有任何必然聯絡。奈何由著我性子來(實際上是突然發現了可以這樣試試)。依舊沒有GIF圖。依舊僅僅作為技術積累研究。 功能點: 橫豎屏切換記錄播放進度 跳轉頁面返回,或者切換後臺再進來記錄播放順訊。

移動端 圖片手勢控制 縮放 移動

var pageX,pageY,position_top,position_left; function setGesture(el) { var obj = {}; //定義一個物件 var istouch = fals

Android多點觸控技術,實現對圖片的放大縮小平移,慣性滑動等功能

首先推薦一下鴻洋大大的打造個性的圖片預覽與多點觸控視訊教程,這套教程教我們一步一步實現了多點觸控實現對圖片的平移和縮放的功能,這篇文章我將在鴻洋大大的基礎之上做了一些擴充套件功能: 1.圖片的慣性滑動 2.圖片縮放小於正常比例時,鬆手會自動回彈成正常比例

QT自定義視窗標題欄實現拖動放大縮小

    去掉Qt視窗的標題邊框,重新定義標題欄,可以在標題欄上實現更多的功能,能滿足更多的開發需求,可以實現標題欄的拖動,雙擊,自定義放大縮小。      本文引用自:http://www.devbean.net/2011/10/custom-qt-titlebar/,感謝

unity通過改變相機視野實現UI元素放大縮小的效果

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class MoveAndScrol

IOS學習 觸控和手勢UITouch 擊、移動檢視

@interface HomeViewController : UIViewController {     UIView *touchView;     UITouch *touch;     NSInteger *tapcount;     CGPoint

unity3d:控制模型旋轉,縮放,並停止控制一段時間後自轉

控制模型:移動端:單指旋轉,雙指縮放 PC:左鍵旋轉,滾輪縮放 using System.Collections; using System.Collections.Generic; using UnityEngine; using Framework.Ev

Android手勢:拖動、縮放圖片

手勢其實是一個比較複雜的東西,首先是因為處理的時機。Android中觸控式螢幕的事件其實只有ACTION_DOWN、ACTION_MOVE和 ACTION_UP這三種,當然我們實現手勢的邏輯時,一般會用到GestureDetector,它有許多封裝好的事件回撥介面,比如on

C/C++ BMP(24位真彩色)影象處理(3)------影象の放大縮小線性插值)

    影象的放大縮小其實是一回事,都是先建立一張空白目標影象(放大縮小後的影象),其大小就是想要放大縮小後所得到的影象大小。建立影象後我們並不知道這張影象裡面的各個畫素點RGB(或灰度)值是多少,這個時候就需要經過一個演算法去算目標影象的畫素點RGB(或灰度)值。基本上所

Unity判斷手勢的滑動方向,觸控和多點觸控,並獲取剛觸控以及觸控結束事的座標

Unity判斷手勢觸控的型別 ,判斷手勢的滑動方向,並獲取剛觸控以及觸控結束事的座標 本章咱們一起來看下unity對有觸控手勢做出的響應 單點觸控 Input.touchCount==1 移動觸控 Input.GetTouch(0).phase==TouchPhas

兩個手指多點觸控 滑動 放大縮小 縮放

using UnityEngine; using System.Collections; public class FingersTwo : MonoBehaviour {   public   GameObject  m1, m2;   int Z_Far = 0, Z_