一、案例說(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;