iOS ARKit男娄,SceneKit,RealityKit總結(jié)

基礎(chǔ)概念就不講了,講講SceneKitRealityKit構(gòu)建AR場景的差異模闲。

一.支持的系統(tǒng)和手機(jī)型號

1.SceneKit支持iOS11.0以上系統(tǒng)建瘫,iphone 6s以上手機(jī)(即iphone8,1以上)。
2.RealityKit支持iOS13.0以上系統(tǒng)尸折,iphone xs以上手機(jī)(即iphone11,2以上)啰脚。

二.追蹤模式

1.平面追蹤

沒有區(qū)別,iOS11.3以上支持垂直平面檢測(如墻面)实夹,iOS13支持人體遮擋拣播,AR場景不再浮在人物表面,而是根據(jù)空間位置有人體遮擋效果收擦。讓AR體驗更加真實。

let config = ARWorldTrackingConfiguration()
if #available(iOS 13.0,*){
   if ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth){
       config.frameSemantics = .personSegmentationWithDepth
   }
}
2.人體追蹤

RealityKit支持人體追蹤谍倦,具體代碼官方已給出塞赂。可以獲得人體各個節(jié)點(diǎn)的三維坐標(biāo)昼蛀,但是比較耗性能宴猾,可以在sessiondidUpdate代理方法里降低檢測頻率。

三.添加3D模型

1.SceneKit除了可以創(chuàng)建比較規(guī)則的3D模型叼旋,如SCNBox仇哆,SCNTube等,還支持加載dae格式和obj格式的3D模型夫植。

let scene = SCNScene(name:"~.scnassets/model.dae") 
let node = SCNNode()
for child in scene.rootNode.childNodes{
 node.addChildNode(child)
}

2.RealityKit可以創(chuàng)建比較規(guī)則的3D模型和3D文字(ModelEntity)讹剔,也可以支持加載usdz格式的3d模型(導(dǎo)出usdz格式的方法)。

var cancellable : AnyCancellable ?= nil
cancellable = Entity.loadModelAsync(name:"model.usdz").sink(receiveCompletion:{  completion in 
  if case let .failure(error) = comletion{
    print("加載失斚昝瘛:\(error.locaizedDescription)")
  }
  cancellable?.cancel()
},receiveValue:{(character:Entity) in
  if let entity = character as? ModelEntity{
    entity.scale = [0.001,0.001,0.001] //調(diào)整模型比例
    cancellabe?.cancel()
  }else{
  //沒有找到ModelEntity類型的
  }
})

四.模型動畫

1.系統(tǒng)動畫

SceneKit支持關(guān)鍵幀動畫延欠,即CAKeyframeAnimation,常見的有移動,旋轉(zhuǎn)沈跨,放大等由捎。還支持SCNAction,SCNTransaction動畫饿凛。

let node = SCNNode()
node.addAnimation(keyFrameAnimation(),forKey:nil)

//位置移動(從初始位置往0狞玛,0,0處移動)
let position = node.position
let moveAnimation = CAKeyframeAnimation.init(keyPath:"transform.translation")
moveAnimation.value = [NSValue.init(scnVector3:position),NSValue.init(scnVector3:SCNVector3Make(0,0,0))]

//scale動畫(從0到1)
let scaleAnimation = CAKeyframeAnimation.init(keyPath:"scale")
scaleAnimation.value = [NSValue.init(scnVector3:SCNVector3Make(0,0,0)),NSValue.init(scnVector3:SCNVector3Make(1,1,1))]

//rotate動畫(繞y軸旋轉(zhuǎn))
let rotateAnimation = CAKeyframeAnimation.init(keyPath:"rotation")
scaleAnimation.value = [NSValue.init(scnVector3:SCNVector4Make(0,0,0,0)),NSValue.init(scnVector3:SCNVector4Make(0,1,0,Float(-2*Double.pi)))]

RealityKit支持的系統(tǒng)動畫就比較少了涧窒。

let entity = ModelEntity(
  //省略
)
var transform = entity.transform

//scale動畫
transform.scale = SIMD3<Float>(repeating:1.0)
entity.move(to:transform,relationTo:entity.parent,duration:1,timingFunction.easeOut)

//rotate動畫(繞y軸旋轉(zhuǎn))
transform.rotation = simd_quatf(angle:-pi,axis:[0,1,0])
entity.move(to:transform,relationTo:entity.parent,duration:1,timingFunction.easeOut)

2.模型自帶動畫

SceneKit加載和播放dae模型動畫

//加載動畫
let sceneURL = Bundle.main.url(forResource: sceneName, withExtension: "dae")
let sceneSource = SCNSceneSource(url: sceneURL!, options: nil)
let ids = sceneSource?.identifiersOfEntries(withClass:CAAnimation.self)
if let animationObject = sceneSource?.entryWithIdentifier((ids?.first)!, withClass: CAAnimation.self)
{
  animationObject.repeatCount = 1
  animationObject.fadeInDuration = CGFloat(1)
  animationObject.fadeOutDuration = CGFloat(0.5)
  //保存到字典
  animations[withKey] = animationObject
}

//播放心肪、移除動畫
sceneView.scene.rootNode.addAnimation(animations[key]!, forKey: key)
sceneView.scene.rootNode.removeAnimation(forKey: key, blendOutDuration: CGFloat(0.5))
RealityKit加載和播放usdz模型動畫(這個還未驗證,待填坑纠吴,可以參考開發(fā)文檔:Animation Playback

五.采集攝像頭數(shù)據(jù)

1.SceneKitRealityKit都可以在session的代理方法里拿到CVPixelBuffer數(shù)據(jù)蒙畴,然后進(jìn)行Metal,OpenGL ES圖像處理和音視頻編碼。

    func session(_ session: ARSession, didUpdate frame: ARFrame) {
        let pixelBuffer = frame.capturedImage
    }

2.但此處拿到CVPixelBuffer數(shù)據(jù)是不包含AR效果的膳凝。有個方案是:開個定時器每0.1s使用snapshot方法獲取AR view的截屏碑隆,然后和攝像頭取得的數(shù)據(jù)合成。

3.可以參考GitHub上的ARVideoKit蹬音,支持ar截圖上煤,gifs,視頻劫狠。但目前不支持RealityKit,希望后續(xù)能補(bǔ)上永部。

六.其他問題

1.Archive時出現(xiàn)了no such module RealityKit報錯。
版本兼容性問題苔埋。低版本中不包含RealityKit這個庫,需要加上編譯開關(guān)组橄。

# if canImport(RealityKit)
import RealityKit
  //相關(guān)代碼
#endif

2.RealityKit中的Entity沒有隱藏的方法,可以設(shè)置materials的顏色為透明色玉工。

self.entity.model.materials[0] = SimpleMaterial(color:roughness:,isMetallic:)

3.SceneKitrender代理方法里內(nèi)存經(jīng)常暴漲羽资,有優(yōu)化的空間(此坑待填)遵班。

七.總結(jié)

RealityKit的人體追蹤還是很驚艷的,能夠較為準(zhǔn)確的識別人體動作狭郑,但是功耗高,攝像頭發(fā)熱非常明顯愿阐。另外可使用的api較SceneKit少微服,有待完善缨历。AR是非常值得期待的技術(shù)以蕴,就目前表現(xiàn)而言,娛樂性較強(qiáng)辛孵。而將娛樂性轉(zhuǎn)化為實用性丛肮,還有很長的一段路要走。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末魄缚,一起剝皮案震驚了整個濱河市宝与,隨后出現(xiàn)的幾起案子焚廊,更是在濱河造成了極大的恐慌,老刑警劉巖习劫,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咆瘟,死亡現(xiàn)場離奇詭異,居然都是意外死亡诽里,警方通過查閱死者的電腦和手機(jī)袒餐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谤狡,“玉大人灸眼,你說我怎么就攤上這事∧苟” “怎么了焰宣?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捕仔。 經(jīng)常有香客問我匕积,道長,這世上最難降的妖魔是什么逻澳? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮暖呕,結(jié)果婚禮上斜做,老公的妹妹穿的比我還像新娘。我一直安慰自己湾揽,他們只是感情好瓤逼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著库物,像睡著了一般霸旗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戚揭,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天诱告,我揣著相機(jī)與錄音,去河邊找鬼民晒。 笑死精居,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潜必。 我是一名探鬼主播靴姿,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼磁滚!你這毒婦竟也來了宵晚?” 一聲冷哼從身側(cè)響起维雇,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钝凶,沒想到半個月后唁影,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哟沫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年嗜诀,在試婚紗的時候發(fā)現(xiàn)自己被綠了孔祸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拂蝎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悼泌,到底是詐尸還是另有隱情,我是刑警寧澤可柿,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布趾痘,位于F島的核電站,受9級特大地震影響卵贱,放射性物質(zhì)發(fā)生泄漏滥沫。R本人自食惡果不足惜兰绣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一缀辩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧臀玄,春花似錦畅蹂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽示损。三九已至,卻和暖如春夺溢,著一層夾襖步出監(jiān)牢的瞬間论巍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工双泪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焙矛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓村斟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親孩灯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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