Unity3D開(kāi)發(fā)技術(shù)研究- 商湯SenseAR案例

一、案例說(shuō)明

SenseAR開(kāi)發(fā)者平臺(tái)能夠提供實(shí)時(shí)跟蹤與建圖痴昧、尺度估計(jì)、多平面檢測(cè)冠王、光照估計(jì)赶撰、手勢(shì)檢測(cè)、稠密重建功能柱彻。

(1)實(shí)時(shí)跟蹤與建圖:能夠?qū)崿F(xiàn)6DOF跟蹤豪娜,融合視覺(jué)和IMU信息,實(shí)時(shí)定位手機(jī)的位姿信息和輸出周?chē)h(huán)境的地圖信息哟楷。
(2)尺度估計(jì): 尺度估計(jì)把虛擬物體模型以真實(shí)的大小準(zhǔn)確的放在真實(shí)場(chǎng)景中侵歇。
(3)多平面檢測(cè):快速檢測(cè)水平面和豎直平面(如地面和墻面)的大小和位置。
(4)光照估計(jì):估計(jì)當(dāng)前環(huán)境的光照情況 吓蘑。
(5)手勢(shì)檢測(cè):包括手勢(shì)的2D/3D關(guān)鍵點(diǎn)、手勢(shì)姿態(tài)類(lèi)型等信息的檢測(cè)坟冲、以及手勢(shì)在RGB圖和深度圖上分割結(jié)果輸出磨镶,支持基于手的AR互動(dòng)交互。
(6)稠密重建:融合深度與RGB信息健提,建立稠密環(huán)境網(wǎng)格琳猫,實(shí)現(xiàn)實(shí)時(shí)環(huán)境稠密重建。
(7)圖像識(shí)別與跟蹤:借助增強(qiáng)圖像功能私痹,幫助識(shí)別并標(biāo)記環(huán)境中的一系列2D目標(biāo)圖像脐嫂,并在攝像頭移到圖像外時(shí)仍可標(biāo)記該圖像位置。
(8)云錨點(diǎn):利用云端技術(shù)使位于同一現(xiàn)實(shí)場(chǎng)景中的多臺(tái)設(shè)備可加載同一個(gè)錨點(diǎn)紊遵,并渲染到各自的場(chǎng)景中账千,在該錨點(diǎn)上進(jìn)行AR體驗(yàn)和交互。
(9)人臉識(shí)別與跟蹤:基于RGB信息暗膜,獲取增強(qiáng)現(xiàn)實(shí)中的人臉模型匀奏,實(shí)現(xiàn)人臉的實(shí)時(shí)識(shí)別與跟蹤。
(10)三維物體識(shí)別與跟蹤:基于RGB信息学搜,在線建立三維物體模型娃善,并實(shí)現(xiàn)三維物體模型的實(shí)時(shí)識(shí)別與跟蹤。

二瑞佩、框架視圖

三聚磺、手勢(shì)識(shí)別

工程
一: 初始化
主要步驟:
1、初始化增強(qiáng)現(xiàn)實(shí)對(duì)象炬丸。
初始化過(guò)程中瘫寝,需要?jiǎng)?chuàng)建ARWorld這個(gè)對(duì)象。ARWorld是整個(gè)增強(qiáng)現(xiàn)實(shí)世界的管理對(duì)象,通過(guò)ARWorld可以獲取手勢(shì)算法運(yùn)行過(guò)程中的手勢(shì)等信息矢沿,同時(shí)也可以通過(guò)ARWorld獲取當(dāng)前畫(huà)面幀對(duì)象滥搭,通過(guò)畫(huà)面幀對(duì)象,用戶可以獲取當(dāng)前幀的相機(jī)位姿等信息捣鲸。

ARWorld mARWorld = new ARWorld

2瑟匆、算法配置
通過(guò)ARConfig可以對(duì)ARWorld進(jìn)行配置,主要配置開(kāi)啟的算法栽惶、開(kāi)啟模式等重要信息愁溜。比如要以RGB后置攝像頭模式開(kāi)啟手勢(shì)識(shí)別算法,則可以這樣配置外厂。

ARConfig config = new ARConfig(mARWorld);
mCurrentAlgorithmMode = ARConfig.AlgorithmMode.ENABLED;       config.setAlgorithmMode(ARConfig.AlgorithmType.HAND_GESRURE,ARConfig.AlgorithmMode.ENABLED);
mARWorld.configure(config);

手勢(shì)識(shí)別配置參考代碼如下:

  private ARWorld mARWorld;
  private ARMap mMap;

  protected void onCreate(Bundle savedInstanceState) {
    //其他代碼省略
   Exception exception = null;
        String message = null;
        try {
            mARWorld = new ARWorld(/* context= */ this);
        } catch (UnavailableApkTooOldException e) {
            message = "Please Install AR Library";
            exception = e;
        } catch (UnavailableSdkTooOldException e) {
            message = "Please update this app";
            exception = e;
        } catch (UnavailableDeviceNotCompatibleException e) {
            message = "This device does not support AR";
            exception = e;
        }

        if (message != null) {
            Log.e(TAG, "Exception creating session", exception);
            return;
        }

        // Create default config and check if supported.
        ARConfig config = new ARConfig(mARWorld);
        if (!mARWorld.isSupported(config)) {
            Toast.makeText(this, "This device does not support AR", Toast.LENGTH_SHORT).show();
        }
        //使用RGB相機(jī)
        mCurrentStreamMode = ARConfig.StreamMode.BACK_RGB;
        //使用RGBD攝像頭
        //mCurrentStreamMode = ARConfig.StreamMode.BACK_RGBD;
        config.setStreamMode(mCurrentStreamMode);
        config.setAlgorithmMode(ARConfig.AlgorithmType.HAND_GESRURE, ARConfig.AlgorithmMode.ENABLED);
        mARWorld.configure(config);
        mMap = mARWorld.acquireMap();

}

二: 獲取手勢(shì)信息
1冕象、通過(guò)上面的配置,開(kāi)啟了手勢(shì)識(shí)別算法汁蝶,要獲取手勢(shì)信息渐扮,只需在GLSurfaceView.Renderer的onDrawFrame里每幀調(diào)用ARWorld類(lèi)的update函數(shù),更新幀以及幀對(duì)應(yīng)的各類(lèi)算法運(yùn)行信息掖棉。

ARFrame frame = mSession.update();

2墓律、通過(guò)增強(qiáng)現(xiàn)實(shí)地圖對(duì)象ARMap獲取正在追蹤的手勢(shì)列表。

List<ARHandGestureNode> handGestures = (List<ARHandGestureNode>)       mMap.getAllNodes(ARHandGestureNode.class);

3幔亥、目前版本的手勢(shì)只支持單手耻讽,所以從List<ARHandGestureNode>中,取出第一個(gè)ARHandGestureNode對(duì)象帕棉,就是要獲取的手勢(shì)的對(duì)象针肥,ARHandGestureNode對(duì)象描述了詳細(xì)的手勢(shì)信息。

      if (handGestures.size() > 0) {
                ARHandGestureNode handGesture = handGestures.get(0);
          //如果要獲取手勢(shì)的類(lèi)型信息香伴,則通過(guò)調(diào)用手勢(shì)對(duì)象handGesture的 //getHandGestureType()方法獲取慰枕,要獲取其他信息,則通過(guò)此對(duì)象的相對(duì)應(yīng)的方法獲取
   ARHandGestureNode.HandGestureType handGestureType = handGesture.getHandGestureType();
    }

整個(gè)獲取手勢(shì)信息的參考代碼如下:

 public void onDrawFrame(GL10 gl) {
            ARFrame frame = mARWorld.update();
            //獲取正在跟蹤的手勢(shì)列表
            List<ARHandGestureNode> handGestures = (List<ARHandGestureNode>) mMap.getAllNodes(ARHandGestureNode.class);
            if (handGestures.size() > 0) {
                ARHandGestureNode handGesture = handGestures.get(0);
                //獲取手勢(shì)類(lèi)型
                ARHandGestureNode.HandGestureType handGestureType = handGesture.getHandGestureType();
                //獲取手勢(shì)是左手還是有手
                ARHandGestureNode.HandSide handSide = handGesture.getHandSide();
                //獲取手勢(shì)的朝向(手心即纲,手背捺僻,側(cè)手)
                ARHandGestureNode.HandTowards handTowards = handGesture.getHandTowards();
                //獲取手勢(shì)框
                Rect handRect = handGesture.getHandRect();
                //獲取2d手指關(guān)鍵點(diǎn)的數(shù)量
                int point2dCount = handGesture.getLandMark2DCount();
                //獲取手指關(guān)鍵點(diǎn)2D坐標(biāo)(x,y)
                Vector3f[] points2d = handGesture.getGetLandMark2DPoints();
                //獲取3d手指關(guān)鍵點(diǎn)的數(shù)量
                int point3dCount = handGesture.getLandMark3DCount();
                //獲取手指關(guān)鍵點(diǎn)3D坐標(biāo)(x,y,z)
                Vector3f[] points3d = handGesture.getGetLandMark3DPoints();
                //獲取手掌中心法向量
                Vector3f plamCenter = handGesture.getPalmCenter();
                //獲取手掌朝向法向量
                Vector3f plamNormal = handGesture.getPalmNormal();
          }
    //其他代碼已省略
}

三、云錨點(diǎn)共享

通過(guò)云錨點(diǎn)崇裁,可以讓位于同一現(xiàn)實(shí)場(chǎng)景中的多臺(tái)設(shè)備加載同一個(gè)錨點(diǎn)匕坯,并渲染到各自的場(chǎng)景中,在該錨點(diǎn)上進(jìn)行AR體驗(yàn)和交互拔稳。
云錨點(diǎn)可以讓位于同一現(xiàn)實(shí)場(chǎng)景的設(shè)備多次進(jìn)入同一個(gè)AR場(chǎng)景葛峻。
云錨點(diǎn)的解析和托管通過(guò)商湯服務(wù)器完成,為了體驗(yàn)該AR效果巴比,必須保證客戶端設(shè)備連接互聯(lián)網(wǎng)术奖,可以正常訪問(wèn)商湯服務(wù)器礁遵。
托管錨點(diǎn)
錨點(diǎn)數(shù)據(jù)保存在商湯服務(wù)器,上傳的原始數(shù)據(jù)無(wú)法通過(guò)任何方式獲取采记。
在托管時(shí)佣耐,周?chē)沫h(huán)境特征也會(huì)被上傳,該數(shù)據(jù)在上傳前已被處理為點(diǎn)云數(shù)據(jù)唧龄,不會(huì)辨別用戶當(dāng)前的地理位置和物理環(huán)境兼砖。
錨點(diǎn)在托管成功后的168個(gè)小時(shí)內(nèi),均可以通過(guò)云錨點(diǎn)ID進(jìn)行解析既棺。
解析錨點(diǎn)
解析錨點(diǎn)可以同步多臺(tái)設(shè)備在相同物理環(huán)境中的坐標(biāo)系框架讽挟。
解析錨點(diǎn)時(shí)會(huì)將您當(dāng)前物理環(huán)境中的點(diǎn)云信息上傳至服務(wù)器作為解析依據(jù),解析后得到當(dāng)前設(shè)備坐標(biāo)系下的云錨點(diǎn)坐標(biāo)丸冕。
解析錨點(diǎn)的請(qǐng)求數(shù)據(jù)在解析完成后就會(huì)被拋棄耽梅。

共享錨點(diǎn)ID
示例應(yīng)用使用普通的服務(wù)器在設(shè)備之間共享云錨點(diǎn)ID。您可以在自己的應(yīng)用中使用不同的解決方案胖烛。
示例所需的應(yīng)用層服務(wù)器代碼在SDK中提供眼姐,請(qǐng)按以下步驟部署:
1、在SenseAR SDK for Android中找到cloud_anchor_Demo_Server文件佩番,并且確保您的計(jì)算機(jī)可以運(yùn)行python3命令众旗。
2、打開(kāi)終端并執(zhí)行以下指令python3 server.py答捕,您可以新開(kāi)一個(gè)終端運(yùn)行python3 client.py進(jìn)行測(cè)試。
3屑那、在工程ARCloudClient.java文件中拱镐,配置您電腦的IP。

package com.standardar.ar.core.examples.c.arcloud;

public class ARCloudClient {
    private static final String AR_CLOUD_ADDR = "YOUR IP ADDRESS";
    private static final int AR_CLOUD_PORT = 9092;

    //...
}

添加應(yīng)用key/secret
使用錨點(diǎn)云服務(wù)持际,必須要在應(yīng)用中添加一個(gè)key和secret密鑰沃琅。
1、獲取key/secret蜘欲,參見(jiàn)快速入門(mén)益眉。
2、在Android Studio中姥份,將key/secret添加至您的項(xiàng)目中郭脂。

void CloudAnchorApplication::OnResume() {
    //...
    const ArStatus status = ArSession_resume(ar_session_);
    arWorldSetKeyAndSecret(ar_session_, "YOUR KEY", "YOUR SECRET");
    //...
}

工程
開(kāi)啟云錨點(diǎn)功能
云錨點(diǎn)功能默認(rèn)是關(guān)閉的狀態(tài),要開(kāi)啟云錨點(diǎn)功能需要調(diào)用arConfigSetAlgorithmMode開(kāi)啟云錨點(diǎn)功能澈歉。

CHECK(arWorldCreate(env, context, &ar_session_) == ARRESULT_SUCCESS);
CHECK(ar_session_);

ARConfig *ar_config = nullptr;
arConfigCreate(&ar_config);
arConfigSetAlgorithmMode(ar_config, ARALGORITHM_TYPE_SLAM, ARALGORITHM_MODE_ENABLE);
arConfigSetAlgorithmMode(ar_config, ARALGORITHM_TYPE_PLANE_DETECTION, ARALGORITHM_MODE_ENABLE);
arConfigSetAlgorithmMode(ar_config, ARALGORITHM_TYPE_LIGHT_ILLUMINATION, ARALGORITHM_MODE_ENABLE);
arConfigSetAlgorithmMode(ar_config, ARALGORITHM_TYPE_CLOUD_ANCHOR, ARALGORITHM_MODE_ENABLE);

CHECK(arWorldConfigure(ar_session_, ar_config) == ARRESULT_SUCCESS);

設(shè)置key/secret
要使用云錨點(diǎn)服務(wù)展鸡,需要經(jīng)過(guò)云服務(wù)授權(quán),進(jìn)行key/secret認(rèn)證埃难。

CHECK(arWorldResume(ar_session_) == ARRESULT_SUCCESS);
arWorldSetKeyAndSecret(ar_session_, "YOUR KEY", "YOUR SECRET");

托管錨點(diǎn)
將本地錨點(diǎn)托管至云端使之成為云錨點(diǎn)莹弊,可供多臺(tái)設(shè)備解析并共享涤久。arWorldHostAnchor獲取的云錨點(diǎn)對(duì)象可能是未就緒的狀態(tài),當(dāng)狀態(tài)為

ARCLOUD_ANCHOR_STATE_SUCCESS方可使用忍弛,未就緒時(shí)獲取到的ID為空响迂。

//anchor is local anchor, m_cloud_anchor is cloud anchor.
if(arWorldHostAnchor(ar_session_, anchor, &m_cloud_anchor) == ARRESULT_SUCCESS) {
    m_cloud_anchor_in_progress = true;
}

錨點(diǎn)解析
通過(guò)云錨點(diǎn)ID為線索進(jìn)行解析云錨點(diǎn)细疚,arWorldResolveAnchor方法獲取的云錨點(diǎn)對(duì)象可能是未就緒的狀態(tài)蔗彤,當(dāng)狀態(tài)為ARCLOUD_ANCHOR_STATE_SUCCESS方可使用,未就緒時(shí)獲取的位姿為不可用狀態(tài)惠昔。

if(arWorldResolveAnchor(ar_session_, anchor_id, &m_cloud_anchor) == ARRESULT_SUCCESS){
    m_cloud_anchor_in_progress = true;
}

獲取云錨點(diǎn)狀態(tài)
當(dāng)進(jìn)行了托管錨點(diǎn)或解析錨點(diǎn)操作后幕与,需要不斷地查詢?cè)棋^點(diǎn)狀態(tài),
ARCLOUD_ANCHOR_STATE_TASK_IN_PROGRESS表示錨點(diǎn)還在托管/解析中镇防,需再等待啦鸣;
ARCLOUD_ANCHOR_STATE_SUCCESS表示托管/解析成功,可以進(jìn)行后續(xù)操作来氧;
ARCLOUD_ANCHOR_STATE_ERROR_XXX表示在托管/解析過(guò)程中發(fā)生了錯(cuò)誤诫给,需釋放該錨點(diǎn),重新進(jìn)行托管/解析操作啦扬。

if(m_cloud_anchor_in_progress){
    arAnchorGetCloudState(ar_session_, m_cloud_anchor, &m_cloud_state);
    switch (m_cloud_state){
        // code
    }
}

獲取云錨點(diǎn)ID
獲取云錨點(diǎn)ID的操作一般在錨點(diǎn)托管成功后進(jìn)行中狂,將云端分配的云錨點(diǎn)ID進(jìn)行分享,供其他用戶進(jìn)行解析該錨點(diǎn)扑毡。

if(m_cloud_anchor_in_progress){
    arAnchorGetCloudState(ar_session_, m_cloud_anchor, &m_cloud_state);
    switch (m_cloud_state){
        case ARCLOUD_ANCHOR_STATE_SUCCESS: {
            // ...
            arAnchorGetCloudAnchorId(ar_session_, m_cloud_anchor, m_anchor_id, 64);
            break;
        }
        // ...
    }
}

云錨點(diǎn)流程圖


四胃榕、三維物體識(shí)別與跟蹤

三維物體跟蹤與識(shí)別主要是分為創(chuàng)建模型和物體識(shí)別與跟蹤兩部分。SenseAR通過(guò)對(duì)真實(shí)環(huán)境中的三維物體進(jìn)行實(shí)時(shí)掃描瞄摊,在線創(chuàng)建并保存掃描后的模型文件勋又。當(dāng)物體出現(xiàn)在相機(jī)視野中,SenseAR將通過(guò)加載物體模型文件换帜,檢測(cè)該三維物體楔壤,用戶可通過(guò)移動(dòng)手機(jī)實(shí)時(shí)檢測(cè)和追蹤該物體在真實(shí)環(huán)境中的位置,從而實(shí)現(xiàn)AR效果與三維物體的空間一致性惯驼。

功能描述

  • SenseAR可以掃描環(huán)境中的三維物體并保存為模型文件蹲嚣。
  • SenseAR可以檢測(cè)和跟蹤環(huán)境中的三維物體,提供物體的位置以及朝向等參數(shù)祟牲。
  • 識(shí)別與跟蹤的效果與掃描結(jié)果有關(guān)隙畜,掃描越充分,保存的點(diǎn)云數(shù)量越多说贝,識(shí)別與跟蹤的效果越好禾蚕。
  • 所有功能都是在設(shè)備本地完成的,無(wú)須遠(yuǎn)程訪問(wèn)連接網(wǎng)絡(luò)狂丝。
  • 掃描APK已經(jīng)提供换淆,下載地址ObjectC.apk

操作流程

1.放置Bounding box:初始化后點(diǎn)擊右上角scan按鈕,之后點(diǎn)擊屏幕即可放置Bounding Box哗总;
2.Bounding box調(diào)整

  • 調(diào)整大小:兩個(gè)手指分離或者聚合實(shí)現(xiàn)倍试;

  • 調(diào)整形狀:雙擊bounding box的某一個(gè)面讯屈,手指離開(kāi)屏幕再點(diǎn)擊屏幕拖拉,實(shí)現(xiàn)增加或者減小垂直于該面的線段長(zhǎng)度县习;

  • 調(diào)整位置:?jiǎn)螕艉笏砷_(kāi)再點(diǎn)擊實(shí)現(xiàn)平行于該面的拖移涮母;

3.Bounding box染色:點(diǎn)擊屏幕下方中間scan按鈕開(kāi)始掃描,移動(dòng)手機(jī)將bounding box所有面染色躁愿,完成所有的染色后點(diǎn)擊finish按鈕叛本,至此,完成掃描過(guò)程彤钟;
4.識(shí)別跟蹤:點(diǎn)擊右上角的track按鈕来候,實(shí)現(xiàn)手機(jī)畫(huà)面再次出現(xiàn)該三維物體的時(shí)候,能夠識(shí)別跟蹤該物體的功能逸雹,識(shí)別跟蹤成功的標(biāo)志是手機(jī)中顯示之前掃描過(guò)程中的andriod小人;

最佳操作

關(guān)于選擇三維模型

  • 建議使用表面有豐富紋理营搅,紋理區(qū)分度高,不透明且無(wú)明顯反光的剛性物體梆砸。如果有部分區(qū)域紋理不明顯可能會(huì)導(dǎo)致在這個(gè)區(qū)域無(wú)法識(shí)別转质。
  • 建議掃描過(guò)程中光線較明亮。
  • 建議使用過(guò)程中背景紋理不要過(guò)于豐富帖世。
  • 模型掃描過(guò)程中如果保存的點(diǎn)云數(shù)量較少時(shí)休蟹,會(huì)導(dǎo)致后續(xù)檢測(cè)跟蹤過(guò)程效果變差。
  • 確定三維包圍框?qū)⑽矬w包圍住日矫,包圍框在長(zhǎng)高寬三個(gè)方向大小合適赂弓。
  • 在掃描過(guò)程中,手機(jī)移動(dòng)需要速度較慢且無(wú)較大抖動(dòng)搬男。

關(guān)于優(yōu)化識(shí)別和跟蹤

  • 跟蹤環(huán)境中的三維物體與掃描時(shí)相比外觀無(wú)明顯變化拣展。
  • 物件所在環(huán)境中跟蹤與掃描時(shí)相比無(wú)明顯的光線變化彭沼。
  • 在跟蹤過(guò)程中相機(jī)運(yùn)動(dòng)不要過(guò)快缔逛。
  • 最大識(shí)別面積為1/9。(圖像在相機(jī)畫(huà)面中的占比)

加載參考物體

首先需要?jiǎng)?chuàng)建新的ARReferenceObjectDatabase姓惑。

ARReferenceObjectDatabase objectDatabase = new ARReferenceObjectDatabase(mWorld);

然后可以選擇以下方式添加參考圖像褐奴。

添加掃描工具生成的物體模型文件

使用arReferenceObjectDatabaseAddObject向數(shù)據(jù)庫(kù)中添加物體模型:

std::string sampleObjectName[1] = {"1.obj"};
std::string file_path = "/sdcard/1.obj";
char* object_buffer;
int object_buffer_length;
if(util::LoadFile(file_path, &object_buffer, &object_buffer_length)) {
    if(object_buffer && object_buffer_length > 0) {
        int index = 0;
        ARResult status = arReferenceObjectDatabaseAddObject(ar_world_,                                                        ar_object_tracking_database,                                                          sampleObjectName[0].c_str(), (uint8_t *) object_buffer,                                                          object_buffer_length,&index);
        CHECK(status == ARRESULT_SUCCESS);
        delete[] object_buffer;
    }
}
break;

注意事項(xiàng)

目前只支持單物體跟蹤,一次只能加載一個(gè)模型文件于毙。

啟用物體追蹤

通過(guò)ARConfig配置所需的參考物體數(shù)據(jù)庫(kù)敦冬,SenseAR開(kāi)始識(shí)別跟蹤物體:

arConfigSetAlgorithmMode(ar_config, ARALGORITHM_TYPE_OBJECT_TRACKING, ARALGORITHM_MODE_ENABLE);
ARReferenceObjectDatabase* ar_object_database = CreateObjectTrackingDatabase();
arConfigSetReferenceObjectDatabase(ar_world_, ar_config, ar_object_database);
arReferenceObjectDatabaseDestroy(ar_object_database);
CHECK(arWorldConfigure(ar_world_, ar_config) == ARRESULT_SUCCESS);

在會(huì)話期間,SenseAR將通過(guò)攝像頭圖像中的特征點(diǎn)匹配參考物體數(shù)據(jù)庫(kù)來(lái)尋找物體唯沮。
要獲取匹配的物體脖旱,請(qǐng)?jiān)谀膸卵h(huán)中輪詢有無(wú)更新的ARObjectNode堪遂。

ARNodeList *updated_object_list = nullptr;
arNodeListCreate(ar_world_, &updated_object_list);
CHECK(updated_object_list != nullptr);
arMapGetAllNodes(ar_world_, ar_map_, ARNODE_TYPE_OBJECT, updated_object_list);

int32_t object_list_size;
arNodeListGetSize(ar_world_, updated_object_list, &object_list_size);
float light_intensity = 0.8f;

for (int i = 0; i < object_list_size; ++i) {
    ARNode *ar_node = nullptr;
    arNodeListAcquireItem(ar_world_, updated_object_list, i,
                          &ar_node);
    ARObjectNode *object = ARNodeAsARObjectNode(ar_node);

    ARTrackingState tracking_state;
    arNodeGetTrackingState(ar_world_, ar_node, &tracking_state);

    int object_index;
    arObjectNodeGetIndex(ar_world_, object, &object_index);
    switch (tracking_state) {
        case ARTRACKING_STATE_STOPPED:
            break;
        case ARTRACKING_STATE_SUCCESS: {
            util::ScopedArPose scopedArPose(ar_world_);
            arObjectNodeGetCenterPose(ar_world_, object,
                                      scopedArPose.GetArPose());
            ARPose *pose = scopedArPose.GetArPose();

            // Render Andy objects.
            glm::mat4 model_mat(1.0f);
            arPoseGetMatrix(pose, glm::value_ptr(model_mat));
            andy_renderer_.Draw(projection_mat, view_mat, model_mat, light_intensity);
            break;
        }
        default:
            break;
    }
}

arNodeListDestroy(updated_object_list);
updated_object_list = nullptr;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市萌庆,隨后出現(xiàn)的幾起案子溶褪,更是在濱河造成了極大的恐慌,老刑警劉巖践险,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猿妈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巍虫,警方通過(guò)查閱死者的電腦和手機(jī)彭则,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)占遥,“玉大人俯抖,你說(shuō)我怎么就攤上這事】昶担” “怎么了蚌成?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凛捏。 經(jīng)常有香客問(wèn)我担忧,道長(zhǎng),這世上最難降的妖魔是什么坯癣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任瓶盛,我火速辦了婚禮,結(jié)果婚禮上示罗,老公的妹妹穿的比我還像新娘惩猫。我一直安慰自己,他們只是感情好蚜点,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布轧房。 她就那樣靜靜地躺著,像睡著了一般绍绘。 火紅的嫁衣襯著肌膚如雪奶镶。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天陪拘,我揣著相機(jī)與錄音厂镇,去河邊找鬼。 笑死左刽,一個(gè)胖子當(dāng)著我的面吹牛捺信,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播欠痴,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼迄靠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秒咨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起掌挚,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拭荤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后疫诽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舅世,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年奇徒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雏亚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摩钙,死狀恐怖罢低,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胖笛,我是刑警寧澤网持,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站长踊,受9級(jí)特大地震影響功舀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜身弊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一辟汰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阱佛,春花似錦帖汞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至淮逊,卻和暖如春催首,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壮莹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工翅帜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姻檀,地道東北人命满。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绣版,于是被迫代替她去往敵國(guó)和親胶台。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歼疮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容