1. 程式人生 > >【EasyAR學習】縮放和拖動模型

【EasyAR學習】縮放和拖動模型

        開發AR手機端軟體時,雙手縮放、拖動模型是最常見的功能,也是一種最基本的互動手段。
        在 Unity 中想要獲取使用者的鍵盤或滑鼠的事件的話,就必須使用 Input 類來獲取。一般來說 Input 類的方法需要寫在 Update() 方法中。
        檢視Unity的API手冊,可以看到常用的Input類方法:
        1、與滑鼠有關的Input類方法:
        (1)Input.GetMouseButton(0)表示“滑鼠左鍵按下”;
Input.GetMouseButton(1)表示“滑鼠右鍵按下”;
       Input.GetMouseButton(2)表示“滑鼠中鍵按下”。
        2、與觸碰有關的Input類方法:
        (1)Input.touchCount表示“觸碰數量”;
        (2)Input.GetTouch(0) 表示“當第一隻手指觸碰時”;
                【Input.GetTouch(1)表示第二隻手觸碰;Input.GetTouch(2)表示第三隻手觸碰;……以此類推】
        (3)TouchPhase 表示“觸碰狀態”。有以下5中狀態:
                ①Began :按下;
                ②Moved :移動;
                ③Stationary :按住但沒移動;
                ④Ended :離開;
                ⑤Canceled :用於觸碰超過5點以上或貼至臉上時取消追蹤。
        (4)Input.GetTouch(0).position 表示“取得第一隻手指觸碰時的座標”。

接下來,就在【EasyAR---顯示模型】的基礎上,實現縮放、拖動模型。

一、縮放模型

        在模型Cube上掛載一個C#指令碼來實現該功能,命名為“Gesture.cs”,指令碼的路徑為“Assets/Test1/Scripts/”。指令碼程式碼如下:

using System.Collections;
using UnityEngine;

public class Gesture : MonoBehaviour {

    private Touch oldTouch1;  //上次觸控點1(手指1)
    private Touch oldTouch2;  //上次觸控點2(手指2)

    void Update()
    {
        //沒有觸控,就是觸控點為0
        if (Input.touchCount <= 0)
        {
            return;
        }

        //多點觸控, 放大縮小
        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);//Vector2表示2D的向量和點。
        float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);

        //兩個距離之差,為正表示放大手勢, 為負表示縮小手勢
        float offset = newDistance - oldDistance;

        //放大因子,一個畫素按 0.01倍來算(100可調整)
        float scaleFactor = offset / 100f;

        Vector3 localScale = transform.localScale;////Vector3表示3D的向量和點,Transform.localScale表示自身縮放.
        Vector3 scale = new Vector3(localScale.x + scaleFactor,
            localScale.y + scaleFactor,
            localScale.z + scaleFactor);

        //在什麼情況下進行縮放,最小縮放到0.05倍
        if (scale.x >= 0.05f && scale.y >= 0.05f && scale.z >= 0.05f)
        {
            transform.localScale = scale;
        }

        //記住最新的觸控點,下次使用
        oldTouch1 = newTouch1;
        oldTouch2 = newTouch2;
    }
}
二、拖動模型

        同樣在模型Cube上掛載一個C#指令碼來實現該功能,命名為“Drag.cs”,指令碼的路徑為“Assets/Test1/Scripts/”。指令碼程式碼如下:

using System.Collections;
using UnityEngine;

public class Drag : MonoBehaviour {
    //定義私有變數
    private Vector3 _vec3TargetScreenSpace;// 目標物體的螢幕空間座標

    private Vector3 _vec3TargetWorldSpace;// 目標物體的世界空間座標

    private Transform _trans;// 目標物體的空間變換元件

    private Vector3 _vec3MouseScreenSpace;// 滑鼠的螢幕空間座標

    private Vector3 _vec3Offset;// 偏移

    void Awake()
    {
        _trans = transform;
    }

    IEnumerator OnMouseDown() //迭代器介面
    {
        // 把目標物體的世界空間座標轉換到它自身的螢幕空間座標
        _vec3TargetScreenSpace = Camera.main.WorldToScreenPoint(_trans.position);

        // 儲存滑鼠的螢幕空間座標(Z值使用目標物體的螢幕空間座標)
        _vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);

        // 計算目標物體與滑鼠物體在世界空間中的偏移量
        _vec3Offset = _trans.position - Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace);

        // 滑鼠左鍵按下
        while (Input.GetMouseButton(0))
        {
            // 儲存滑鼠的螢幕空間座標(Z值使用目標物體的螢幕空間座標)
            _vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);

            // 把滑鼠的螢幕空間座標轉換到世界空間座標(Z值使用目標物體的螢幕空間座標),加上偏移量,以此作為目標物體的世界空間座標
            _vec3TargetWorldSpace = Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace) + _vec3Offset;

            // 更新目標物體的世界空間座標
            _trans.position = _vec3TargetWorldSpace;

            // 等待固定更新
            yield return new WaitForFixedUpdate();
        }
    }
}

三、打包成apk檔案

        點選“File→Build Settings”,彈出如下介面,點選“Add Open Scenes”將場景新增進來,然後選擇Android平臺,先點選“Switch Platform”切換平臺,再點選“Player Settings”進行播放器設定。


設定如下:
①“Company Name” 與我們申請key時的公司或團隊名相同(比如我申請時填的是:nuanyang), 
②“ProductName” 也要和我們申請key時填的應用名相同(本次的專案演示為:Test1)。
③“Other Settings”選項裡面,將“Auto Graphics API”後面複選框的√去掉,“Graphics APIs” 選擇“OpenGLES2”;
④“Other Settings”選項裡,“Identification”下的“Package Name”和“Minimum API Level”也要修改。

⑤在“Publishing Settings”選項下的“Keystore password”中填寫申請的key。

  



        然後點選“Build”,選擇已經安裝的Android SDK資料夾“android-sdk-windows”,進行打包。在手機上安裝並執行已經打包好了的Test.apk,執行效果如下。


        執行出現的問題:執行後,發現可以實現放大和縮小功能,無法拖動物體。上網查了一下資料,發現是Box collider碰撞器的範圍沒有設定,只有一個點。

        解決辦法:點選Edit Collider,把碰撞器的範圍設定成如下圖所示,就行了。

             

        再次打包並執行,就可以實現拖動模型的功能了。

          

相關推薦

EasyAR學習模型

        開發AR手機端軟體時,雙手縮放、拖動模型是最常見的功能,也是一種最基本的互動手段。        在 Unity 中想要獲取使用者的鍵盤或滑鼠的事件的話,就必須使用 Input 類來獲取。一般來說 Input 類的方法需要寫在 Update() 方法中。   

OpenCV學習影象

《OpenCV入門指南》系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764  一. 主要函式介紹 1.1 cvResize 函式功能:影象大小變換 函式原型: voidcvResize(  

Android 實現圖片

今天我們來編寫一個縮放效果的ImageView ,網上有很多人都講了這些。但有許多人都直接使用了庫檔案, 那麼我們今天做的是直接上程式碼編寫一個拖動和縮放的ImageView,具體看效果圖, 那麼簡單了分析一下。在手機上縮放圖片和拖動要用到什麼?手指對不

Android自定義imageview可對圖片進行多點

package com.msstudent.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import andro

機器學習--LDA初始應用

alloc learn .get lis oca pat 文章 text 對應關系 一、前述 LDA是一種 非監督機器學習 技術,可以用來識別大規模文檔集(document collection)或語料庫(corpus)中潛藏的主題信息。它采用了詞袋(bag of word

Fiddler學習Fiddler簡介Web抓包應用(轉)

  一、Fiddler是什麼?     Fiddler是一個http協議除錯代理工具,它能夠記錄並檢查所有你的電腦和網際網路之間的http通訊,設定斷點,檢視所有的進出Fiddler的資料。 Fiddler 要比其他的網路偵錯程式要更加簡單,因為它不僅僅暴露http通

爬蟲工具Fiddler學習Fiddler簡介Web抓包應用-----------一

https://blog.csdn.net/persistencegoing/article/details/84376427 一、Fiddler是什麼?     Fiddler是一個http協議除錯代理工具,它能夠記錄並檢查所有你的電腦和網際網路之間的http通訊,設定

tensorflow 學習tf.get_variable()tf.Variable()的區別

1. tf.Variable() W = tf.Variable(<initial-value>, name=<optional-name>) 用於生成一個初始值為initial-value的變數。必須指定初始化值 2.tf.get_variab

C#學習delegate(委託) event(事件)

C# 中的委託(Delegate)類似於 C 或 C++ 中函式的指標。委託(Delegate) 是存有對某個方法的引用的一種引用型別變數。引用可在執行時被改變。在C#中方法不能作為引數直接傳遞,必須使用委託(用來委託方法)。delegate(委託)是一種特殊的引用型別,它將方法也作為特殊的物件封裝

EasyAR學習播放本地視訊

Step1:環境搭建1、新建unity專案,將unitypackage包匯入到unity3D中,會在Project面板看到如下圖所示的資料夾.2、刪除Main Camera,並將AR相機-------EasyAR_ImageTracker-1拖入到Hierarchy面板中,並

機器學習Tensorflow:理解實現快速風格化影象fast neural style

Neural Style開闢了計算機與藝術的道路,可以將照片風格化為名家大師的畫風。然而這種方法即使使用GPU也要花上幾十分鐘。Fast Neural Style則啟用另外一種思路來快速構建風格化影象,在筆記本CPU上十幾秒就可以風格化一張圖片。我們來看看這是什

EasyAR學習多圖識別

1、新建unity專案,將EasyAR_SDK_2.2.0_Basic.unitypackage包匯入到unity3D中。匯入unitypackage包後,會在Project面板看到如下圖所示的資料夾。2、在unity中新建一個資料夾“StreamingAssets”,用來存

UML學習--構件圖部署圖

一、構件圖(元件圖)      一輛汽車由輪子、發動機等物理部件組成,一個軟體往往也是由很多“物理部件”(如:控制元件、重用構件等)組成的,元件圖就是用來描述軟體內部物理組成的一種圖。1.構件表示的變化: (1)UML1.4中 (2)UML2.0中 2.構件圖中的關係

IOS學習訊息轉發它的實際應用

訊息轉發,適用於把操作給另外一個類來實現 -(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { NSMethodS

關於百度地圖拽的回撥函式

1.縮放的回撥函式 zoomstart {type, target} 地圖更改縮放級別開始時觸發觸發此事件 zoomend {type, target} 地圖更改縮放級別結束時觸發觸發此事件   a、實現縮放動作開始時,返回地圖中心點座標: map

tensorflow 學習tf.split()tf.squeeze()

split( value, num_or_size_splits, axis=0, num=None, name='split' ) 輸入: value: 輸入的tensor num_or_size_splits:

機器學習隨機森林 Random Forest 得到模型後,評估參數重要性

img eas 一個 increase 裏的 sum 示例 增加 機器 在得出random forest 模型後,評估參數重要性 importance() 示例如下 特征重要性評價標準 %IncMSE 是 increase in MSE。就是對每一個變量 比如 X1

重點突破——Drag&Drop與釋放

style cti script urn 知識點 dragstart document 觸發 get 一、引言 在學習HTML5新特性的時候,學到了Drag&Drop這兩種拖放API,這裏根據拖動的是“源對象”還是“目標對象”做兩個小練習,主要是為了理解與應用HTM

點選螢幕對顯示物件進行操作:調整位置/旋轉模式/

1.載入資源 2.將資源新增到顯示列表並設定錨點 ////////////////////////////////*調整位置關鍵程式碼*/ this.stage.addEventListener(egret.TouchEvent.TOUCH_BEGIN, (e: egret.TouchEvent) =&

機器學習貝葉斯線性迴歸模型

假設當前資料為X,迴歸引數為W,結果為B,那麼根據貝葉斯公式,可以得到後驗概率: ,我們的目標是讓後驗概率最大化。其中pD概率是從已知資料中獲取的量,視為常量;pw函式是w分佈的先驗資訊。 令:   求l函式最大化的過程稱為w的極大似然估計(ML),求pie函式最小化的