寫在前面
由于之前在申請專利,所以文章不能發(fā)出來仲闽,現(xiàn)在發(fā)出來幫助有需要的人眼虱。
Animoji
蘋果在今年的十周年特別版iPhone X發(fā)布會上或舞,推出了Animoji功能。該功能基于iPhone X的結(jié)構(gòu)光傳感器蒙幻,捕捉用戶的表情變化,生成相應(yīng)的3D動畫表情胆筒。本文介紹了基于ARKit + SceneKit的Animoji實(shí)現(xiàn)方案邮破。
Animoji原理
???在人臉建模后,通過獲取人臉追蹤與表情捕捉的數(shù)據(jù)仆救,更新到虛擬形象上抒和,使虛擬形象與用戶人臉的位置與表情相同步。
(1)?人臉建模
在高端設(shè)備上彤蔽,借助紅外攝像頭與結(jié)構(gòu)光點(diǎn)陣投影儀摧莽,根據(jù)獲取的點(diǎn)云數(shù)據(jù),結(jié)合利用泛光照明器得到的紅外圖像顿痪,通過隨機(jī)交替獲取二者數(shù)據(jù)镊辕,做3D人臉建模。
(2)人臉追蹤與表情捕捉
人臉追蹤:依據(jù)人臉檢測算法和SLAM(同步定位與地圖構(gòu)建)算法蚁袭,實(shí)時追蹤人臉在圖像中的位置變化征懈,并計算人臉在3D空間中的位置。
表情捕捉:依據(jù)基于深度學(xué)習(xí)的表情識別算法揩悄,通過匹配用戶當(dāng)前人臉數(shù)據(jù)到表情庫卖哎,識別出用戶當(dāng)前表情。
(3)虛擬形象渲染
構(gòu)建與真實(shí)世界相同坐標(biāo)的虛擬世界删性,創(chuàng)建虛擬形象并實(shí)時計算它與人臉之間的位置映射關(guān)系亏娜,基于表情捕捉得到的數(shù)據(jù)來更新虛擬形象的動畫表情。
Animoji效果
Animoji方案
本方案使用?變形動畫+骨骼動畫+骨骼控制?來實(shí)現(xiàn)Animoji蹬挺。
變形動畫:使用預(yù)先制作好的表情基作為變形目標(biāo)维贺,通過變形的方式來確定模型表面每個頂點(diǎn)最終的位置,使用SceneKit渲染的話汗侵,可以用SCNMorpher來實(shí)現(xiàn)幸缕。
骨骼控制:在設(shè)計師刷好骨骼對蒙皮的權(quán)重后,就可以通過骨骼控制或者加載骨骼動畫來實(shí)現(xiàn)非變形部分的動畫晰韵。
骨骼動畫
建立虛擬形象模型
(1)虛擬形象靜態(tài)模型
虛擬形象分為強(qiáng)表情部分和弱表情部分发乔,以頭部舉例:臉部為強(qiáng)表情部分,眼睛牙齒耳朵等為弱表情部分雪猪。強(qiáng)表情部分用捕捉的表情數(shù)據(jù)更新栏尚,弱表情部分則根據(jù)用戶頭部的運(yùn)動數(shù)據(jù)與表情變化來更新。
例如:用戶邊轉(zhuǎn)頭邊做鬼臉只恨,強(qiáng)表情部分译仗,即臉部會更新為用戶的表情形象抬虽,而弱表情部分,如耳朵骨骼會根據(jù)用戶頭部轉(zhuǎn)動的速度變彎曲纵菌,舌頭會在嘴巴長到一定幅度伸出阐污。
(2)制作表情基
表情基分為普通表情基與混合表情基。表情基與靜態(tài)模型的強(qiáng)表情部分的拓?fù)浣Y(jié)構(gòu)完全一致咱圆,且在同一個尺度空間下大小相同笛辟。不同表情基,模型的網(wǎng)格頂點(diǎn)數(shù)一樣序苏,多邊形一一對應(yīng)手幢,不同的是頂點(diǎn)的位置不同(如大笑嘴部的頂點(diǎn)就會有位移)。
普通表情基是一些設(shè)計好的臉部模型忱详,如圖3围来。普通表情基代表一些固定的人臉表情,如張嘴匈睁、眨眼监透,為了縮減大小,表情基除了幾何體沒有其他任何信息航唆,并且分割為若干子部分才漆。
混合表情基是若干特定的普通表情基的非線性組合,在運(yùn)行時計算得出佛点,用以擴(kuò)展表情的豐富度醇滥,理論上有混合表情基的支持,虛擬形象能夠模擬無限多個表情超营,而不是只在普通表情基這個維度鸳玩,混合表情基的計算方式如下式,?B( i )表示第i 個混合表情基演闭,E( j )表示第j個普通表情基不跟。
表情分割
本系統(tǒng)將表情分割成5部分,在加載表情時米碰,只使用有效部分窝革,(如眨眼就只加載眼部),縮小了表情的計算量吕座。分割表情時虐译,使用更平滑的頂點(diǎn)法線來避免分割后可能產(chǎn)生的裂縫。
表情權(quán)重分配機(jī)制
本系統(tǒng)對不同表情分配了不同的權(quán)重吴趴,在更新時漆诽,對于高權(quán)重的表情,會先加載先更新,提高每次更新表情的用戶體驗(yàn)厢拭,縮短關(guān)鍵表情的等待時間兰英,流程圖如下。
分包加載
本系統(tǒng)的加載方式采用分包加載的方式供鸠,首先將分割好的表情基分布存儲在若干文件中畦贸,在需要的時候分包加載,模型開始更新的時間是之前的20%楞捂。
建立骨骼
對于弱表情部分家制,他們是根據(jù)頭部的運(yùn)動與表情變化來做更新,本系統(tǒng)對弱表情部分建立骨骼來控制它們泡一。當(dāng)用戶向右看時,控制眼球骨骼向右旋轉(zhuǎn)觅廓;當(dāng)用戶張嘴時鼻忠,控制下巴骨骼向下旋轉(zhuǎn);當(dāng)用戶向右轉(zhuǎn)頭時杈绸,耳朵會根據(jù)轉(zhuǎn)頭速度向左旋轉(zhuǎn)帖蔓。
骨骼動畫
除了上一點(diǎn)所說的更新方式,本系統(tǒng)還使用骨骼動畫來來做更精致瞳脓、可運(yùn)營的表情塑娇。骨骼動畫與命中邏輯可動態(tài)下發(fā)。
基于人臉追蹤與表情捕捉數(shù)據(jù)更新虛擬形象
初始化之后劫侧,虛擬形象會添加到虛擬世界中埋酬,用戶人臉在真實(shí)世界中的運(yùn)動會同步到虛擬形象在虛擬世界的運(yùn)動。同時通過表情捕捉數(shù)據(jù)烧栋,拆解用戶表情為普通表情基和混合表情基的線性組合钻哩,利用此組合更新虛擬形象的強(qiáng)表情部分诫肠。如下式,?E(user)是用戶當(dāng)前的表情,E是普通表情基厉亏,B是混合表情基。
更新方式是:遍歷表情基E的網(wǎng)格的每一個頂點(diǎn)弯汰,通過下式計算其最終的位置综慎。其中V(i)表示第i?個頂點(diǎn),V(E1)表示在表情基E1中相應(yīng)的頂點(diǎn)酬姆,A(i)表示表情Ei的權(quán)重嗜桌。
對于弱表情部分,本系統(tǒng)根據(jù)頭部的運(yùn)動與表情的變化辞色,通過骨骼控制它們症脂。弱表情部分包括但不限于耳朵、下牙與舌頭、眼球诱篷。
對于耳朵:
當(dāng)頭部轉(zhuǎn)動時壶唤,通過判斷轉(zhuǎn)頭的速度來控制耳朵骨骼的旋轉(zhuǎn),從而彎曲耳朵棕所。計算公式如下式闸盔,Ear(eulerAngles)為耳朵骨骼的歐拉角,V(x), V(y)?分別為頭部轉(zhuǎn)動的偏航角速度琳省、俯仰角速度迎吵,A、B分別為計算所需的補(bǔ)償值针贬,效果如圖6击费。
1)??當(dāng)用戶張大嘴時,耳朵向內(nèi)彎曲桦他,彎曲幅度由云端控制蔫巩。
2)??當(dāng)用戶閑置時,耳朵部分播放骨骼動畫快压,動畫與觸發(fā)邏輯由云端下發(fā)圆仔。
對于下牙與舌頭:
1)??當(dāng)用戶張嘴時,下牙與舌頭的骨骼配合張嘴表情向下旋轉(zhuǎn)蔫劣。計算公式如下坪郭,Jaw為下牙與舌頭骨骼的歐拉角,H?為云端控制的最大俯仰角閾值脉幢,A為當(dāng)前表情的張嘴表情系數(shù)歪沃。
2)??當(dāng)用戶張嘴且下唇特征點(diǎn)出現(xiàn)特定變化,判斷用戶在張嘴伸舌頭嫌松,變形舌頭并伸出舌頭绸罗,效果如圖9。
3)??當(dāng)用戶張嘴伸舌頭時豆瘫,移動頭部珊蟀,控制舌頭左右變形,以符合頭部的運(yùn)動外驱。
對于眼球:
1)??眼球的轉(zhuǎn)動主要根據(jù)眼部表情變化來控制育灸,計算方式如下式,Eye為眼球骨骼的歐拉角昵宇,S為計算旋轉(zhuǎn)的方向值磅崭,H為云端控制的最大俯仰角與偏航角閾值,A為當(dāng)前表情的眼部表情變化系數(shù)瓦哎。
全景背景與粒子特效
通過下發(fā)不同的360全景圖片或視頻作為背景砸喻。當(dāng)用戶做特殊表情或者特殊話語柔逼,觸發(fā)全景背景的更改與粒子特效,當(dāng)用戶旋轉(zhuǎn)手機(jī)時割岛,能看到不同的內(nèi)容愉适,豐富了產(chǎn)品的應(yīng)用空間,效果如下圖癣漆。
更進(jìn)一步
目前模型的體積較大,考慮采用運(yùn)行時平滑惠爽、著色的方式癌蓖,實(shí)現(xiàn)素材包的體積減少,使用運(yùn)行時加頂點(diǎn)的平滑方式婚肆,可以讓素材包減小80%左右租副。
與TTS結(jié)合,讓用戶可以通過語音控制一些彩蛋邏輯较性。
結(jié)合圖像處理用僧、深度學(xué)習(xí)算法,拓寬應(yīng)用場景两残,實(shí)現(xiàn)更好玩的玩法。