天天看點

從 Pokémon Go 談 AR 遊戲開發

Pokémon Go 一出,新鮮的玩法、經典的 IP 效應讓這款使用了 Unity 以及 AR 技術的手遊火遍了“大洋”南北。可惜的是這款新鮮的遊戲還沒有惠及中國市場的玩家們。騰訊内部的 AR 專家秉持着“一言不合就自己開發”的原則,自發對 AR 遊戲進行了預研,本文将通過在 Unity 中對 OpenCV 及 Vuforia 庫的使用,簡單介紹制作 AR 遊戲的一系列流程。

如果你在街頭巷尾

看到這樣拿着手機到處晃悠的景象

他們一定是在抓小精靈!

從 Pokémon Go 談 AR 遊戲開發
從 Pokémon Go 談 AR 遊戲開發
從 Pokémon Go 談 AR 遊戲開發

AR 技術是什麼?

增強現實(Augmented Reality,簡稱 AR ),是一種實時地計算攝影機影像的位置及角度并加上相應圖像的技術,這種技術的目标是在螢幕上把虛拟世界套在現實世界并進行互動。簡單的說,在 Pokémon Go 這款 AR 遊戲中,精靈是虛拟的, 地圖是真實的,虛拟的精靈出現在了真實的地圖之中,給了玩家十分新鮮的體驗。

于是 Pokemon Go 拯救了無數的死宅們,大家上街抓

從 Pokémon Go 談 AR 遊戲開發

上廁所也抓

從 Pokémon Go 談 AR 遊戲開發

不過,Pokémon Go現在還拯救不了國内的死宅們,

目前Pokémon Go在國内已被鎖區,

而解鎖的時間還不确定......

然而!騰訊的技術大牛在遇到新鮮事物的時候是攔不住的!秉持着“一言不合就自己開發”的原則,大牛決定,自己做一個 AR 遊戲!!

Pokémon Go 的遊戲引擎用到了 Unity 技術,在騰訊大牛預研的 AR 遊戲中,分别用到了 OpenCV 及 Vuforia 庫,下面将簡單分享下兩個庫的使用。

從 Pokémon Go 談 AR 遊戲開發

想收服小蘿莉嗎?

OpenCV 是英特爾發起并參與開發的計算機視覺庫,在圖像處理、模式識别及計算機視覺領域被廣泛使用,這裡就不做過多介紹了。

Unity 有現成的 OpenCV 庫,使用起來很友善。

具體使用方法:

導入 OpenCV for Unity.unitypackage

将導入後 OpenCVForUnity 目錄下的 Plugins 和 StreamingAssets 檔案夾移到 Assets 目錄下

OpenCVForUnity 目錄下的 Samples 裡有很多寫好的示例,比如門檻值分割、霍夫變換檢測直線、人臉檢測等,如果想運作需要在 Build Settings 裡添加好對應場景,其中有的需要用到攝像頭。

從 Pokémon Go 談 AR 遊戲開發
從 Pokémon Go 談 AR 遊戲開發

背景是組裡基于 Unity 做的一個 AR 小遊戲——打飛碟,其中使用 OpenCV 實作了紅外效果及人臉檢測:

紅外模式:

從 Pokémon Go 談 AR 遊戲開發
從 Pokémon Go 談 AR 遊戲開發

當場景中出現了半透明的敵機時,可開啟紅外模式看清隐形敵機的位置。

這裡主要用 OpenCV 對攝像頭擷取的圖像做了顔色變換:首先将圖像轉為灰階圖( cvtColor ),然後基于某個色譜,根據不同的灰階值映射為不同的顔色( applyColorMap )。

對于此類濾鏡也可以通過 Unity 的 Shader 來做(如下圖),相比 OpenCV 性能要好些,但 OpenCV 做圖像處理更靈活,也可以盡量去優化:

限制圖像的更新頻率;

降低圖像的分辨率(OpenCV可以用resize);

對于必要的Mat可以在類初始化時申請好空間,不用每次處理圖像都申請再釋放;

利用多線程(主要用在了人臉檢測子產品)。

從 Pokémon Go 談 AR 遊戲開發

好友助戰:

從 Pokémon Go 談 AR 遊戲開發

遇到強大Boss時,可将攝像頭對準好友(人臉),當檢測到人臉時,會出現好友助戰劇情,協助攻擊Boss。

面具怪:

從 Pokémon Go 談 AR 遊戲開發

同好友助戰模式也利用了人臉檢測,當在圖像中檢測到人臉時,會出現附着在人臉上的面具怪,并跟随其移動。

首先,簡單區分下人臉檢測和人臉識别這兩個概念:人臉檢測是找到圖像中人臉的位置、大小,而人臉識别不僅要檢測出人臉,還要知道這人是誰。

OpenCVForUnity 中的人臉檢測示例用到了基于 Haar 特征及 LBP 特征的兩種分類器來檢測人臉(已經訓練好的分類器,想自己訓練或者自己實作性能更優的算法可以去咨詢優圖~),同時也用到了多線程來異步計算,對于在性能較差的移動裝置上來實作人臉檢測具有較好的參考性。

對于移動裝置,人臉檢測計算量較大(Unity 本身開銷已經不小了),是以不能對每幀圖像都進行檢測,可以利用多線程進行異步計算:

從 Pokémon Go 談 AR 遊戲開發

好友助戰模式是檢測到人臉後,在人臉上添加一些裝飾物(copyTo 用裝飾物的 PNG 圖檔做掩膜)作為劇情的一部分;而面具怪則是根據檢測到人臉的位置和大小來改變怪物的位置和大小。此外,如果進一步需要進行人臉識别,那不建議在移動裝置上做,性能肯定吃不消了,可以用雲,将計算放在伺服器上。

Vuforia 是高通的增強現實庫,對 unity 支援好,使用起來簡單友善,如下圖所示為組内使用 Unity+Vuforia 開發的坦克大戰 AR 版:通過識别預先設定的标志物(此處為 lena 頭像),進而确定遊戲世界所在的平面及大小,和實景結合展現出坦克大戰遊戲場景。

從 Pokémon Go 談 AR 遊戲開發

簡要介紹下 Vuforia 在 Unity 中的使用:

在官網新增賬號後,首先注冊一個 License ,并記下 License Key ;

從 Pokémon Go 談 AR 遊戲開發
從 Pokémon Go 談 AR 遊戲開發

下載下傳 Vuforia 庫導入到 Unity 中;

選取一張待識别圖檔上傳到 Target Manager,如下圖所示

建立 Database:

從 Pokémon Go 談 AR 遊戲開發

添加待識别圖檔:

從 Pokémon Go 談 AR 遊戲開發

生成庫後,注意 Rating 的星級,越高越好(識别度越高);将庫下載下傳下來導入到 Unity 中。

從 Pokémon Go 談 AR 遊戲開發
從 Pokémon Go 談 AR 遊戲開發

在 Unity 中搜尋 ARCamera 和 ImageTarget ,并拖到場景中,ARCamera 中的 App License Key 填入剛才申請的 License Key , Database Load Behaviour( Script )中勾選” Load QQ Database ”(這裡根據 Database 的名字有所不同)和” Activate ”,在 ImageTarget 中的 Database 選擇剛才申請的識别圖檔Database的名字( QQ ),此時場景中會出現識别圖檔

從 Pokémon Go 談 AR 遊戲開發
從 Pokémon Go 談 AR 遊戲開發

根據識别圖檔( ImageTarget )的相對位置将遊戲物體或場景作為 ImageTarget 的子物體進行擺放。

從 Pokémon Go 談 AR 遊戲開發
從 Pokémon Go 談 AR 遊戲開發

按照上述步驟即可在Unity中簡單使用Vuforia庫,如果有更多需求可以去了解下它的其他功能及API;例如,為了增強識别效果,可以加入攝像頭的對焦:

<code>Vuforia.CameraDevice.Instance.SetFocusMode(Vuforia.CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO)</code>;

在實際使用中, Vufroia 庫簡單易用,識别準确度較高,對手機性能消耗适中,但建構的虛拟場景容易因環境幹擾發生一定抖動,影響玩家遊戲體驗;可同時識别多個物體,但準确度有所降低;長時間遊戲會導緻攝像頭發燙。

為了避免以上手遊性能方面對遊戲的負面影響,可以利用一些現成的測試工具進行深度的檢測,騰訊 WeTest 平台下的 Cube 工具可以幫助開發者發現遊戲内分類資源的一個占用情況,尤其是對遊戲場景中的 FPS、CPU、PSS 的變化趨勢重點關注,幫助在遊戲開發過程中不斷改善玩家的體驗。目前功能還在免費開放中。

體驗位址:http://wetest.qq.com/cube

關于測試報告的問題:http://wetest.qq.com/guide/view/?id=267

使用幫助:http://wetest.qq.com/guide/view/?id=266

常見問題:http://wetest.qq.com/guide/view/?id=268

本文由騰訊WeTest授權釋出,如需轉載請聯系騰訊WeTest獲得授權。