SceneKit - AR換裝應(yīng)用解決方案

本節(jié)學(xué)習(xí)目標(biāo)

如何設(shè)計換裝應(yīng)用
解決模型綁定骨骼動畫時出現(xiàn)的問題

由于今年是AR元年,在蘋果推出的ARKit框架之后,各行各業(yè)都在馬不停蹄的玩起了創(chuàng)意,希望在自己的應(yīng)用基礎(chǔ)上加入AR的元素

由于要和原生應(yīng)用進(jìn)行結(jié)合,聰明的移動設(shè)計是都會選擇SceneKit作為AR元素的渲染引擎,還有不少公司會選擇使用其他引擎,做到一半的時候,發(fā)現(xiàn)和原型的iOS 數(shù)據(jù)交互,調(diào)試實在是太繁瑣,工程包大的不可思議,最后有選擇了使用SceneKit來開發(fā)!所以選擇SceneKit的開發(fā)類似的需求是最明知的!

iOS 工程師組合拳 (UIKit + ARKit +SceneKit )

AR換裝通用需求

1.選擇體重,身高,性別,膚色,以及 臉型,體型,腿型,眼睛,嘴巴,鼻子,發(fā)型等生成對應(yīng)的模型
2.根據(jù)選擇的人物,進(jìn)入入住商家進(jìn)行服飾試穿(帽子,衣服,鞋,襪子,皮帶,紗巾,頭巾等)
3.兩種模式AR和瀏覽模式模型(AR模式可以真實的查看整體效果)
4.可以有多種人物動畫(下蹲,跳,跑等)
5.用戶可以將模型身上的服飾,打包生成訂單,在線下單購買

模型設(shè)計篇

1.生成模型
多模型分組,拼接
2.服飾顏色
替換貼圖
3.服飾模型
和人物模型進(jìn)行拼接
4.人物動畫
多模型骨骼動畫,服飾模型骨頭綁定,盡量一致,保證不穿幫

前兩天譚總找我解決一個模型綁定的問題,

在設(shè)計工具上調(diào)試骨骼動畫和人物綁定完全一致,沒有問題,但是加載到SceneKit引擎中出現(xiàn)的模型和動畫偏移的問題

gif5.gif

頭發(fā)的動畫和身體的動畫分開了

先打開調(diào)試模型看一眼

92BAF985FBEBC572A5D5EE499B0A339B.png

猜測是那個部分的骨骼,在設(shè)計時進(jìn)行了旋轉(zhuǎn)導(dǎo)致,所以讓他重新查看一下,之后他改了一下骨骼動畫文件,我重新試了一下,一切正常

gif6.gif

以后大家在開發(fā)過程中遇到這種問題就直接去找設(shè)計了

下面我將完整的加載骨骼正確姿勢的代碼寫在下面,各位開發(fā)類似需求的可以參考一下,demo由于包含了其他公司的模型,這里就不提供給大家了

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController {

    var scnView:ARSCNView!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.scnView = ARSCNView(frame: self.view.bounds)
      // 打開調(diào)試模式
      self.scnView.debugOptions = .showSkeletons
      self.scnView.allowsCameraControl =  true
      self.scnView.scene = SCNScene()
      self.view.addSubview(self.scnView)
      // 分別加載對應(yīng)模型和對應(yīng)的骨骼動畫
      let body = self.generateSkeletonNode("NPC_girl_001.dae", animationFileName: "body_walk.dae")
      let clothes = self.generateSkeletonNode("NPC_girl_clothes001.dae", animationFileName: "body_walk.dae")
      let hair = self.generateSkeletonNode("NPC_girl_hair002.dae", animationFileName: "body_walk.dae")
      let shoes = self.generateSkeletonNode("NPC_girl_shoes001.dae", animationFileName: "body_walk.dae")
    
      // 創(chuàng)建一個人的節(jié)點
      let person = SCNNode()
      person.scale = SCNVector3Make(0.01, 0.01, 0.01)
      person.addChildNode(body)
      person.addChildNode(clothes)
      person.addChildNode(hair)
     person.addChildNode(shoes)
      self.scnView.scene.rootNode.addChildNode(person)
}

override func viewWillAppear(_ animated: Bool) {
   super.viewWillAppear(animated)
   self.scnView.session.run(ARWorldTrackingConfiguration(), options: .resetTracking)
}
func generateSkeletonNode(_ modelFileName:String,animationFileName:String)->SCNNode{
    let resourceName = animationFileName.components(separatedBy: ".")[0]
    let extensionName = animationFileName.components(separatedBy: ".")[1]
    print(resourceName)
    print(extensionName)
    let skeletonNode = SCNSceneSource(url: Bundle.main.url(forResource: resourceName , withExtension:extensionName)! , options: nil)
        let node = SCNScene(named: modelFileName)?.rootNode.clone()
    var animations:[CAAnimation] = []
    let animationIds =  skeletonNode?.identifiersOfEntries(withClass: CAAnimation.self)
    var maxDuration:CFTimeInterval = 0
    for id in animationIds! {
        if   let animation = skeletonNode?.entryWithIdentifier(id, withClass: CAAnimation.self) {
          animations.append(animation)
         maxDuration =  max(maxDuration,animation.duration)
     }
    }
    let animationGroup = CAAnimationGroup()
    animationGroup.animations = animations
    animationGroup.duration = maxDuration
    animationGroup.repeatCount = 1000
    node?.addAnimation(animationGroup, forKey: nil)
    return node!
   }
}

技術(shù)參考Appstore 上架應(yīng)用《SceneKit》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窟感,一起剝皮案震驚了整個濱河市仑濒,隨后出現(xiàn)的幾起案子空骚,更是在濱河造成了極大的恐慌衩匣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戴尸,死亡現(xiàn)場離奇詭異煎饼,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門吆玖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人马篮,你說我怎么就攤上這事沾乘。” “怎么了浑测?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵翅阵,是天一觀的道長。 經(jīng)常有香客問我迁央,道長掷匠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任岖圈,我火速辦了婚禮讹语,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜂科。我一直安慰自己顽决,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布导匣。 她就那樣靜靜地躺著才菠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贡定。 梳的紋絲不亂的頭發(fā)上赋访,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音缓待,去河邊找鬼蚓耽。 笑死,一個胖子當(dāng)著我的面吹牛命斧,可吹牛的內(nèi)容都是我干的田晚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爷辙?” 一聲冷哼從身側(cè)響起森渐,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拂酣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡序宦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了背苦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片互捌。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡潘明,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秕噪,到底是詐尸還是另有隱情钳降,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布腌巾,位于F島的核電站遂填,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏澈蝙。R本人自食惡果不足惜吓坚,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灯荧。 院中可真熱鬧礁击,春花似錦、人聲如沸漏麦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撕贞。三九已至更耻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捏膨,已是汗流浹背秧均。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留号涯,地道東北人目胡。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像链快,于是被迫代替她去往敵國和親誉己。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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