unity+vuforia(AR)(Cloud Recognition)

vuforia的其中一個重要特性,就是雲端識別。識別圖可以不用封存在應用中,而是保存在高通的雲端,也爲自己的應用節省了圖片的容量了,也能方便自己增加識別圖而不用隨時更改應用。那就開始來嘗試下吧。

首先得在https://developer.vuforia.com有自己的開發者賬號,然後到Resource下的Sample例子下載Cloud Recognition開發包,那是一個集合,解壓出來就能看到了,然後import到unity中。Target Manager下選擇CloudDatabases自己創建數據庫名,然後添加識別圖

name自己取,尺寸寬度就寫識別圖的寬度就好了,第三個就是上傳識別圖,第四個上傳要求是txt文件(這個txt文件內容可以自己按需求寫,metadata意思是元數據,當識別成功後可以獲取到對應識別圖的元數據,你可以設置json格式的一些數據,或者你需要的任何字符),識別圖達到三星以上比較好。

接下來到unity界面

把ARCamera,CloudRecognition,ImageTarget拖到Hierarchy界面,將想出現的3D模型拖到ImageTarget下,這裏顯示的unitychan

選擇CloudRecognition,右邊要填寫兩個key,可以在開發者網站上雲數據庫那找到,注意要填寫的是Client的key,這樣纔可以搜索你的雲數據庫。然後要把cloudRecoEventHandler文件拖入,然後把ImageTarget拖到這個文件出來的空格中,即ImageTargetTemplate空中

對了,ImageTarget看不清,不方便擺放模型,可以點擊ImageTarget右邊這裏選擇個圖片,如下圖

最後導出android程序就可以了,掃描下圖片就可以顯示出模型了。跟基礎的區別是識別圖沒存在應用裏,而是高通的雲數據庫中。metadata應該主要用以區別是掃中哪個圖片吧,我自己理解的,還望求教。

最後還有一個小問題需要提一下,用手機掃描的時候,我們可能會發現攝像頭一直沒法對焦,影像模糊,怎麼辦呢?我們可以到ARCamera下的WebCamBehaviour中加上以下代碼:

bool focusModeSet = CameraDevice.Instance.SetFocusMode (CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
if (!focusModeSet) {
      Debug.Log ("Failed to set focus mode (unsupported mode).");
}

如果沒有start方法,就用start方法把上面的代碼包住。如果有就寫start方法裏面就好了。具體的解釋詳見http://bbs.csdn.net/topics/390884037,感謝liang_704959721進行翻譯。

對於cloudRecoEventHandler這個文件,我們也可以自定義,但一定要記得繼承ICloudRecoEventHandler,而且要重寫下面的5個方法:

    /// <summary>
    /// called when the CloudRecoBehaviour has finished initializing
    /// </summary>
    void OnInitialized();
 
    /// <summary>
    /// called when an error is reported during initialization
    /// </summary>
    void OnInitError(TargetFinder.InitState initError);
 
    /// <summary>
    /// called when an error is reported while updating
    /// </summary>
    void OnUpdateError(TargetFinder.UpdateState updateError);
 
    /// <summary>
    /// called when the CloudRecoBehaviour starts or stops scanning
    /// </summary>
    void OnStateChanged(bool scanning);
 
    /// <summary>
    /// called when a new search result is found
    /// </summary>
    void OnNewSearchResult(TargetFinder.TargetSearchResult targetSearchResult);
具體多看看官方給的例子吧委屈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章