【EasyAR學習】縮放和拖動模型
在 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函式最小化的