Animoji實現(xiàn)方案分享

寫在前面

由于之前在申請專利,所以文章不能發(fā)出來,現(xiàn)在發(fā)出來幫助有需要的人。

Animoji

蘋果在今年的十周年特別版iPhone X發(fā)布會上,推出了Animoji功能。該功能基于iPhone X的結(jié)構(gòu)光傳感器,捕捉用戶的表情變化,生成相應的3D動畫表情。本文介紹了基于ARKit + SceneKit的Animoji實現(xiàn)方案。


圖1?發(fā)布會上的Animoji介紹

Animoji原理

???在人臉建模后,通過獲取人臉追蹤與表情捕捉的數(shù)據(jù),更新到虛擬形象上,使虛擬形象與用戶人臉的位置與表情相同步。

(1)?人臉建模

在高端設(shè)備上,借助紅外攝像頭與結(jié)構(gòu)光點陣投影儀,根據(jù)獲取的點云數(shù)據(jù),結(jié)合利用泛光照明器得到的紅外圖像,通過隨機交替獲取二者數(shù)據(jù),做3D人臉建模。

(2)人臉追蹤與表情捕捉

人臉追蹤:依據(jù)人臉檢測算法和SLAM(同步定位與地圖構(gòu)建)算法,實時追蹤人臉在圖像中的位置變化,并計算人臉在3D空間中的位置。

表情捕捉:依據(jù)基于深度學習的表情識別算法,通過匹配用戶當前人臉數(shù)據(jù)到表情庫,識別出用戶當前表情。

(3)虛擬形象渲染

構(gòu)建與真實世界相同坐標的虛擬世界,創(chuàng)建虛擬形象并實時計算它與人臉之間的位置映射關(guān)系,基于表情捕捉得到的數(shù)據(jù)來更新虛擬形象的動畫表情。

Animoji效果

視頻鏈接

Animoji方案

本方案使用?變形動畫+骨骼動畫+骨骼控制?來實現(xiàn)Animoji。

變形動畫:使用預先制作好的表情基作為變形目標,通過變形的方式來確定模型表面每個頂點最終的位置,使用SceneKit渲染的話,可以用SCNMorpher來實現(xiàn)。

骨骼控制:在設(shè)計師刷好骨骼對蒙皮的權(quán)重后,就可以通過骨骼控制或者加載骨骼動畫來實現(xiàn)非變形部分的動畫。

骨骼動畫

建立虛擬形象模型

(1)虛擬形象靜態(tài)模型

虛擬形象分為強表情部分和弱表情部分,以頭部舉例:臉部為強表情部分,眼睛牙齒耳朵等為弱表情部分。強表情部分用捕捉的表情數(shù)據(jù)更新,弱表情部分則根據(jù)用戶頭部的運動數(shù)據(jù)與表情變化來更新。


圖2?強表情部分和弱表情部分

例如:用戶邊轉(zhuǎn)頭邊做鬼臉,強表情部分,即臉部會更新為用戶的表情形象,而弱表情部分,如耳朵骨骼會根據(jù)用戶頭部轉(zhuǎn)動的速度變彎曲,舌頭會在嘴巴長到一定幅度伸出。

(2)制作表情基

表情基分為普通表情基與混合表情基。表情基與靜態(tài)模型的強表情部分的拓撲結(jié)構(gòu)完全一致,且在同一個尺度空間下大小相同。不同表情基,模型的網(wǎng)格頂點數(shù)一樣,多邊形一一對應,不同的是頂點的位置不同(如大笑嘴部的頂點就會有位移)。

普通表情基是一些設(shè)計好的臉部模型,如圖3。普通表情基代表一些固定的人臉表情,如張嘴、眨眼,為了縮減大小,表情基除了幾何體沒有其他任何信息,并且分割為若干子部分。


圖3?不同的表情

混合表情基是若干特定的普通表情基的非線性組合,在運行時計算得出,用以擴展表情的豐富度,理論上有混合表情基的支持,虛擬形象能夠模擬無限多個表情,而不是只在普通表情基這個維度,混合表情基的計算方式如下式,?B( i )表示第i 個混合表情基,E( j )表示第j個普通表情基。


表情分割

本系統(tǒng)將表情分割成5部分,在加載表情時,只使用有效部分,(如眨眼就只加載眼部),縮小了表情的計算量。分割表情時,使用更平滑的頂點法線來避免分割后可能產(chǎn)生的裂縫。


表情權(quán)重分配機制

本系統(tǒng)對不同表情分配了不同的權(quán)重,在更新時,對于高權(quán)重的表情,會先加載先更新,提高每次更新表情的用戶體驗,縮短關(guān)鍵表情的等待時間,流程圖如下。


分包加載

本系統(tǒng)的加載方式采用分包加載的方式,首先將分割好的表情基分布存儲在若干文件中,在需要的時候分包加載,模型開始更新的時間是之前的20%。


建立骨骼

對于弱表情部分,他們是根據(jù)頭部的運動與表情變化來做更新,本系統(tǒng)對弱表情部分建立骨骼來控制它們。當用戶向右看時,控制眼球骨骼向右旋轉(zhuǎn);當用戶張嘴時,控制下巴骨骼向下旋轉(zhuǎn);當用戶向右轉(zhuǎn)頭時,耳朵會根據(jù)轉(zhuǎn)頭速度向左旋轉(zhuǎn)。


圖4?用于控制弱表情部分的骨骼

骨骼動畫

除了上一點所說的更新方式,本系統(tǒng)還使用骨骼動畫來來做更精致、可運營的表情。骨骼動畫與命中邏輯可動態(tài)下發(fā)。

基于人臉追蹤與表情捕捉數(shù)據(jù)更新虛擬形象

初始化之后,虛擬形象會添加到虛擬世界中,用戶人臉在真實世界中的運動會同步到虛擬形象在虛擬世界的運動。同時通過表情捕捉數(shù)據(jù),拆解用戶表情為普通表情基和混合表情基的線性組合,利用此組合更新虛擬形象的強表情部分。如下式,?E(user)是用戶當前的表情,E是普通表情基,B是混合表情基。


更新方式是:遍歷表情基E的網(wǎng)格的每一個頂點,通過下式計算其最終的位置。其中V(i)表示第i?個頂點,V(E1)表示在表情基E1中相應的頂點,A(i)表示表情Ei的權(quán)重。


對于弱表情部分,本系統(tǒng)根據(jù)頭部的運動與表情的變化,通過骨骼控制它們。弱表情部分包括但不限于耳朵、下牙與舌頭、眼球。

對于耳朵:

當頭部轉(zhuǎn)動時,通過判斷轉(zhuǎn)頭的速度來控制耳朵骨骼的旋轉(zhuǎn),從而彎曲耳朵。計算公式如下式,Ear(eulerAngles)為耳朵骨骼的歐拉角,V(x), V(y)?分別為頭部轉(zhuǎn)動的偏航角速度、俯仰角速度,A、B分別為計算所需的補償值,效果如圖6。


圖6?頭部轉(zhuǎn)動時耳朵彎曲

1)??當用戶張大嘴時,耳朵向內(nèi)彎曲,彎曲幅度由云端控制。

2)??當用戶閑置時,耳朵部分播放骨骼動畫,動畫與觸發(fā)邏輯由云端下發(fā)。

對于下牙與舌頭:

1)??當用戶張嘴時,下牙與舌頭的骨骼配合張嘴表情向下旋轉(zhuǎn)。計算公式如下,Jaw為下牙與舌頭骨骼的歐拉角,H?為云端控制的最大俯仰角閾值,A為當前表情的張嘴表情系數(shù)。


2)??當用戶張嘴且下唇特征點出現(xiàn)特定變化,判斷用戶在張嘴伸舌頭,變形舌頭并伸出舌頭,效果如圖9。


圖9?虛擬形象張嘴伸舌頭

3)??當用戶張嘴伸舌頭時,移動頭部,控制舌頭左右變形,以符合頭部的運動。

對于眼球:

1)??眼球的轉(zhuǎn)動主要根據(jù)眼部表情變化來控制,計算方式如下式,Eye為眼球骨骼的歐拉角,S為計算旋轉(zhuǎn)的方向值,H為云端控制的最大俯仰角與偏航角閾值,A為當前表情的眼部表情變化系數(shù)。


全景背景與粒子特效

通過下發(fā)不同的360全景圖片或視頻作為背景。當用戶做特殊表情或者特殊話語,觸發(fā)全景背景的更改與粒子特效,當用戶旋轉(zhuǎn)手機時,能看到不同的內(nèi)容,豐富了產(chǎn)品的應用空間,效果如下圖。


圖?10?背景為360全景圖,用戶轉(zhuǎn)動手機可看到不同

更進一步

目前模型的體積較大,考慮采用運行時平滑、著色的方式,實現(xiàn)素材包的體積減少,使用運行時加頂點的平滑方式,可以讓素材包減小80%左右。

與TTS結(jié)合,讓用戶可以通過語音控制一些彩蛋邏輯。

結(jié)合圖像處理、深度學習算法,拓寬應用場景,實現(xiàn)更好玩的玩法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文章轉(zhuǎn)載自https://blog.csdn.net/n5/article/details/3105872 201...
    EternalSunLhx閱讀 7,753評論 0 2
  • 又是一個人,擁被而眠。睜開慵懶的眼睛,看著太陽一點點升起,我的心卻在一點點跌落:我想見的人,他沒有來。 總是這樣,...
    紫月砂雪閱讀 257評論 7 2
  • 親愛的一承 你好! 我在寫回信的時候,發(fā)寫信五的回信已經(jīng)寫過了,這封應該是信六了,你自己更正一下吧。你看,記錄的好...
    尤承琪閱讀 706評論 5 2
  • 路盡終南 芳草碧連天重陽宮外 檀香繞聲聲泉聚水深淵 冰封古墓前可曾留步 問君寒 一場冷雨過 霹靂碎云端生死皆注定 ...
    夢飲千樽月閱讀 739評論 0 50

友情鏈接更多精彩內(nèi)容