關於AR和Unity的基礎知識,請自行前往各自的文檔中心進行科普。ide
本文以國產的HiAR SDK爲例,往後將嘗試高通的vuforia SDK動畫
基於Hi AR1.2.0 ( hiar_sdk_unity_20160809_v1.2.0_3c0e908.zip ( 47.4 MB ) )ui
Unity3D 5.3.5f1 x64code
Windows 7 x64orm
羅技攝像頭(硬件),攝像頭支架視頻
1. 在SDK的管理後臺建立一個新應用,獲取應用的Appkey和Secret,在Unity中會用到。xml
2. 在SDK的管理後臺中建立圖集,並添加圖片,完成以後發佈圖集blog
3. 把圖集和應用進行關聯繼承
4. 在SDK的管理後臺中下載本地識別包文件,通常是以圖集爲命名的unitypackage文件。接口
我建立的圖集名稱:xxdata
圖集中有如下兩張圖片:
battleboard.png
card.png
下載的本地識別包文件(xxdata.unitypackage),在導入到Unity中的文件以下:
Editor HiAR ImageTargetTextures xxdata battleboard.png card.png StreamingAssets HiAR xxdata.xml (裏面是圖集中的圖片信息,一行是一張圖片的數據,Key值是一個32位字符串) xxdata 792c5ed97942d50f185be13ed9822b3c.db(32位的key和xxdata中對應) 22b72d7e5b182ed15e9ede20268d8a6b.db
總結一下就是:
1. 在Editor\ImageTargetTextures\下有以圖集命名的文件夾,文件夾中有圖集中的圖片文件
2. 在StreamingAssets\HiAR\目錄下有以圖集命名的xml文件和圖集命名的文件夾,文件夾下有圖片Id命名的db文件
xxdata.xml文件內容以下:
<?xml version="1.0" encoding="UTF-8"?> <HiAR> <KeyItemList> <KeyItem name="card" targetID="22b72d7e5b182ed15e9ede20268d8a6b" width="535" height="528" extName=".png" version="1.2.0"></KeyItem> <KeyItem name="battleboard" targetID="792c5ed97942d50f185be13ed9822b3c" width="1024" height="1024" extName=".jpg" version="1.2.0"></KeyItem> </KeyItemList> </HiAR>
32位key值文件名的db文件
某種格式的文件,從裏面能夠看到HiScene AR Key,猜想db中存儲了圖片的識別點數據
圖集中每一個圖片有對應的一個db文件,可知此db文件必然和圖片有關聯關係。
場景層次(Hierarchy)結構:
HiAR Camera (SDK的核心,綁定了兩個腳本:HiAREngineBehaviour,TargetManagerBehaviour)
camera (3D相機,渲染3D GameObject,綁定的腳本:HiARCameraBehaviour)
Imager Target (識別點,能夠有多個,綁定的腳本:ImageTargetBehaviour,實現這幾個接口ITrackableEventHandler, ILoadBundleEventHandler, IRelativeMoveTarget)
識別成功:識別圖移動時或者有遮擋時,Transform的屬性會發生改變,而且ImageTarget下的Child會顯示
識別失敗:Transform屬性無變化,而且ImageTarget下的Child會隱藏
camera source (一個MeshRenderer,硬件攝像頭攝像到的圖像實時渲染在此(相似於render texture?))
camera background (2D相機,渲染camera source的圖形)
重點解釋:
camera (3D相機 Clear Flags爲Depth,拍攝場景中的3D GameObject)
camera background (2D相機,Clear Flags爲Solid Clear,渲染物體攝像頭拍攝的畫面)
攝像頭拍攝的圖像顯示在camera source(mesh renderer)上
攝像頭拍攝的真實畫面和引擎生成的三維物體進行疊加。
當識別圖識別成功以後,執行一些操做,能夠理解爲Callback。
HiAR的例子是:識別成功以後,播放視頻。
固然你能夠在識別成功以後,生成一些模型和場景出來,這樣就和開發其它遊戲同樣,能夠對Scene中的GameObject進行控制,好比播放動畫,打鬥,特效之類的。
把識別圖上的圖像實時渲染在模型上(Material),類型塗鴉。
添加一個待塗包的模型,添加組件:HiARPaint,Shader:HiARPaint
硬件攝像頭拍攝識別圖(實時拍攝)
根據識別到的圖,提取圖像生成Material,動態地渲染。
期間會生成幾個識別點
過程當中若是有拍攝到其它物體,新生成的材質會實時更新
多圖識別,就是在簡單識別的基礎上添加多個ImageTarget
步驟:
動態加載識別目標進行識別跟蹤的功能,繼承自TartgetDynamic
void OnGUI() { if (GUI.Button(new Rect(30, 30, 200, 80), "Add Key")) { AddImageTarget(System.IO.Path.Combine(Application.streamingAssetsPath, Pic1Path), Pic1Key, 1024, 1024); } } //識別回調 public override void OnDynamicReco(RecoResult recoResult) { Debug.Log("識別成功。。。。。"); GameObject gameObject = null; gameObject = new GameObject(); if (recoResult.keyType == KeyType.IMAGE) { gameObject.AddComponent<ImageTargetBehaviour>(); } Debug.LogFormat("recoResult.keyType:{0}", recoResult.keyType); Target target = gameObject.GetComponent<Target>(); if (target == null) { Debug.LogError("Get Target Null !"); return; } target.PixelWidth = recoResult.Width * 0.01f; target.PixelHeight = recoResult.Height * 0.01f; gameObject.transform.parent = transform.parent; gameObject.SetActive(true); if (recoResult.KeyId.Equals(Pic1Key)) { GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.parent = gameObject.transform; cube.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f); } else { Debug.LogErrorFormat("recoResult.KeyId:{0} not equals :{1}", recoResult.KeyId, Pic1Key); } bindingGameObject(gameObject, recoResult.KeyId); }
勾選 ImageTarget (ImageTargetBehaviour組件)的CenterPoint以後,帶有物理引擎效果的物體運動就有了中心點。