前言
這是EasyAR應(yīng)用系列的第二篇置媳,針對(duì)AR視頻播放,“脫卡”功能是亟待解決的問題胸完。
然而,EasyAR的文檔中沒有關(guān)于iOS原生脫卡的具體實(shí)現(xiàn)方式翘贮,論壇中提問也沒有得到有用的回答赊窥。然而,在舊版論壇的請(qǐng)問 iOS 識(shí)別好后 播放視頻尺寸改變問題中择膝,EasyARSupport給出了視頻姿態(tài)和尺寸的修改方法誓琼,代碼由C語言編寫。
筆者從該方法中得到啟發(fā):
追蹤器捕捉到目標(biāo)圖像后肴捉,若目標(biāo)圖像脫離攝像頭范圍時(shí)腹侣,可以調(diào)整視頻的姿態(tài)和尺寸,使視頻仍位于視圖的中央并維持原尺寸齿穗,脫卡問題就迎刃而解傲隶。
實(shí)現(xiàn)
- 分析實(shí)現(xiàn)原理
根據(jù)EasyARSupport提供的代碼截圖,可以得知代碼做了兩件事:
- 初始化一個(gè)
cameraView
并為其data
屬性賦值窃页,其中的下標(biāo)為12的數(shù)值決定了視頻的可見范圍跺株,為關(guān)鍵參數(shù)。 - 為視頻渲染提供了一個(gè)尺寸脖卖,用來規(guī)定視頻的尺寸比例乒省。
因此,我們可以得出解決方案:在適當(dāng)?shù)臅r(shí)機(jī)調(diào)整視頻的姿態(tài)和尺寸畦木,并實(shí)現(xiàn)繼續(xù)播放視頻袖扛。
- 尋找適當(dāng)?shù)臅r(shí)機(jī)
在EasyAR示例代碼的helloar.m的render()
函數(shù)中,targetInstances
為獲取到的目標(biāo)實(shí)例十籍,當(dāng)目標(biāo)實(shí)例的count > 0'即被認(rèn)為追蹤到目標(biāo)蛆封,此時(shí)我們進(jìn)行一系列視頻渲染工作;而當(dāng)其
count > 0`不成立時(shí)勾栗,我們可以認(rèn)為目標(biāo)已脫離攝像頭可視范圍惨篱,此時(shí)即為適當(dāng)?shù)膶?shí)際。 - 實(shí)現(xiàn)脫卡
根據(jù)上文中C語言代碼是參考围俘,我們可以相應(yīng)地編寫OC實(shí)現(xiàn)代碼:
if (imagetargetSize != nil) { // 脫卡
// data[12] = 0; 上下位置參數(shù) -0.5(最上)砸讳, 0(中), 0.5(最下)
NSArray *data = @[@0, @-1, @0, @0, @-1, @0, @0, @0, @0, @0, @1, @0, @0, @0, @-1, @1];
easyar_Matrix44F *cameraView = [easyar_Matrix44F create:data];
easyar_Vec2F *size = [easyar_Vec2F create:@[@1.0f, @1.0f]];
[current_video_renderer render:[camera projectionGL:0.2f farPlane:500.f] cameraview:cameraView size:size];
[video update];
}
其中的imagetargetSize
初始值為nil,并在count > 0
中由[imagetarget size]
的值賦予界牡。其內(nèi)在邏輯是簿寂,imagetargetSize
用于判斷目標(biāo)是否曾被追蹤器獲取,若未獲取欢揖,則視頻也還不確定陶耍,也就不存在調(diào)整姿態(tài)了奋蔚。
綜述
以上她混,iOS原生視頻視頻播放的“脫卡”功能得以實(shí)現(xiàn)烈钞。
這里有helloar_offcard.m供參考。