1. 程式人生 > 實用技巧 >【Three.js】動作檔案BVH檔案格式解析

【Three.js】動作檔案BVH檔案格式解析

動捕相關的檔案格式有很多,常見的像BVH、FBX等等,今天我們著重和大家分享一下BVH這種檔案格式。

一、簡介

BVH是BioVision等裝置對人體運動進行捕獲後產生檔案格式的副檔名。

BVH檔案包含角色的骨骼和肢體關節旋轉資料。BVH 是一種通用的人體特徵動畫檔案格式,廣泛地被當今流行的各種動畫製作軟體支援,如3DMax。

二、檔案格式

檔案主要部分

骨架資訊和資料塊

  • 骨架資訊:按照層次關係,定義瞭如root hip leg等位置和旋轉分量,從而形成一個完整的骨架
  • 資料塊:對應上面的骨架各部位標出每幀的資料資訊

一個BVH檔案包含兩部分,頭部部分和資料部分,頭部部分描述了骨架的層次關係和初始姿勢,資料部分包含了動作(motion)的資料.

三、檔案示例

HIERARCHY
ROOT Hips
{
    OFFSET  0.00    0.00    0.00
    CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
    JOINT Chest
    {
        OFFSET   0.00    5.21    0.00
        CHANNELS 3 Zrotation Xrotation Yrotation
        JOINT Neck
        {
            OFFSET   0.00    18.65   0.00
            CHANNELS 
3 Zrotation Xrotation Yrotation JOINT Head { OFFSET 0.00 5.45 0.00 CHANNELS 3 Zrotation Xrotation Yrotation End Site { OFFSET 0.00 3.87 0.00 } } } JOINT LeftCollar { OFFSET
1.12 16.23 1.87 CHANNELS 3 Zrotation Xrotation Yrotation JOINT LeftUpArm { OFFSET 5.54 0.00 0.00 CHANNELS 3 Zrotation Xrotation Yrotation JOINT LeftLowArm { OFFSET 0.00 -11.96 0.00 CHANNELS 3 Zrotation Xrotation Yrotation JOINT LeftHand { OFFSET 0.00 -9.93 0.00 CHANNELS 3 Zrotation Xrotation Yrotation End Site { OFFSET 0.00 -7.00 0.00 } } } } } JOINT RightCollar { OFFSET -1.12 16.23 1.87 CHANNELS 3 Zrotation Xrotation Yrotation JOINT RightUpArm { OFFSET -6.07 0.00 0.00 CHANNELS 3 Zrotation Xrotation Yrotation JOINT RightLowArm { OFFSET 0.00 -11.82 0.00 CHANNELS 3 Zrotation Xrotation Yrotation JOINT RightHand { OFFSET 0.00 -10.65 0.00 CHANNELS 3 Zrotation Xrotation Yrotation End Site { OFFSET 0.00 -7.00 0.00 } } } } } } JOINT LeftUpLeg { OFFSET 3.91 0.00 0.00 CHANNELS 3 Zrotation Xrotation Yrotation JOINT LeftLowLeg { OFFSET 0.00 -18.34 0.00 CHANNELS 3 Zrotation Xrotation Yrotation JOINT LeftFoot { OFFSET 0.00 -17.37 0.00 CHANNELS 3 Zrotation Xrotation Yrotation End Site { OFFSET 0.00 -3.46 0.00 } } } } JOINT RightUpLeg { OFFSET -3.91 0.00 0.00 CHANNELS 3 Zrotation Xrotation Yrotation JOINT RightLowLeg { OFFSET 0.00 -17.63 0.00 CHANNELS 3 Zrotation Xrotation Yrotation JOINT RightFoot { OFFSET 0.00 -17.14 0.00 CHANNELS 3 Zrotation Xrotation Yrotation End Site { OFFSET 0.00 -3.75 0.00 } } } } } MOTION Frames: 2 Frame Time: 0.033333 8.03 35.01 88.36 -3.41 14.78 -164.35 13.09 40.30 -24.60 7.88 43.80 0.00 -3.61 -41.45 5.82 10.08 0.00 10.21 97.95 -23.53 -2.14 -101.86 -80.77 -98.91 0.69 0.03 0.00 -14.04 0.00 -10.50 -85.52 -13.72 -102.93 61.91 -61.18 65.18 -1.57 0.69 0.02 15.00 22.78 -5.92 14.93 49.99 6.60 0.00 -1.14 0.00 -16.58 -10.51 -3.11 15.38 52.66 -21.80 0.00 -23.95 0.00 7.81 35.10 86.47 -3.78 12.94 -166.97 12.64 42.57 -22.34 7.67 43.61 0.00 -4.23 -41.41 4.89 19.10 0.00 4.16 93.12 -9.69 -9.43 132.67 -81.86 136.80 0.70 0.37 0.00 -8.62 0.00 -21.82 -87.31 -27.57 -100.09 56.17 -61.56 58.72 -1.63 0.95 0.03 13.16 15.44 -3.56 7.97 59.29 4.97 0.00 1.64 0.00 -17.18 -10.02 -3.08 13.56 53.38 -18.07 0.00 -25.93 0.00

3.1頭部部分

  1. HIERARCHY:頭部部分開頭包含”HIERARCHY“關鍵詞

  2. ROOT:接著一行開頭為”ROOT”關鍵詞,後面跟著root的名字.當然,一個root段(segment)之後,允許再定義另一個段,也可以定義為”ROOT”.原理上,BVH檔案能夠包含任何數量的骨架段;

  3. Hips:我們的根節點通常選擇是在髖部,也就是Hip位置,這個位置選的很關鍵,它是一個人體偏向於重心的位置。為什麼將Hip選擇作為根節點?相信大家都知道,人體姿態還原是通過IK或者FK演算法,由於演算法本身存在一定的誤差,所以如果我們將ROOT端取在頭部或者其他部分的話,當我們運算到另一端的時候,動作就會產生較大的誤差(慣性捕捉)。
  4. segment:BVH檔案的格式為遞迴的格式,層次結構的每一個segment包含了一些相關資料,該segment要遞迴定義它的子segment.

  5. OFFSET:segment的第一個資訊是該segment相對於父segment的偏移量(OFFSET), 如果是根ROOT segment則偏移量OFFSET則通常為0,OFFSET指定了X,Y,Z方向上與父segment的偏移量,偏移量也指示用於繪製父segment的長度和方向.

  6. CHANNEL(節點旋轉角度的尤拉角):接下來一是”CHANNEL“頭部資訊,後面跟著的數字表明channels的數目,後面的標籤表明每一個channel的型別,預設順序通常是ZXY;在後面MOTION資訊被解析的時候,這個順序在解析每一行的MOTION資料的時候需要用到.這種格式規定很明顯具有靈活性,能夠允許segment擁有任何數目的channel,且能夠按照任何順序.通常OFFSET的資料只有在骨架資訊裡面會呈現出來,畢竟我們人不可能在運動過程中突然骨頭變長或者變短。旋轉角則是驅動骨架動作的主要資料了(大部分模型的預設姿態都是TPos,也就是人雙手平伸,呈一個T形站立),通過這些資料,我們就能完整地還原出人體的一個姿態,通過連續不斷的姿態,我們就能還原出人體的運動狀態了。

  7. JOINT:接下來能看到”JOINT“和”END SITE“關鍵詞,一個JOINT的定義和ROOT的定義是相同的,除了CHANNEL的數目不同,JOINT正是遞迴開始的地方,剩下部分對JOINT的解析和ROOT一樣的.

  8. END SITE:END SITE結束了遞迴,它的定義還包含了一些資料,它提供了前segment的長度,就像前面子segment提供了offset用於繪製父segment的長度和方向(由於此時該節點為最後一個節點,例如手指末端,所以不再有旋轉資料);

  9. JOINT結尾:JOINT的結尾以右括號結束,BVH中,空間被定義成了右旋座標系與Y軸作為世界向量;

  10. 平移量:通常來說,子關節的平移資訊儲存在OFFSET裡面,而旋轉資訊是Motion部分儲存的,跟關節的話,平移量=OFFSET+Motion儲存的XYZ。

3.2資料部分

  1. MOTION:資料部分以MOTION開頭,Frames: 定義幀數,Frame Time:定義資料取樣速率-每幀的時間長度,如0.033333則表示BVH檔案的一般取樣速率,每秒30幀

  2. 接下來的一長串數字就是實際的運動資料資料塊,對應上面定義好的骨架資訊層次結構。(數字的個數=(JOINT個數*JOINT自帶的CHANNELS個數+ROOT*ROOT自帶的CHANNELS個數)*Frames,本例中:(17*3+6)*2=112)

四、關鍵詞

  • HIERARCHY: 開頭
  • ROOT: 根關節
  • JOINT: 根關節下的關節
  • OFFSET: 子關節相對父關節的偏移,也可以表示對應父關節的長度和方向,當子關節不止一個時,採用第一個子關節的資料.
  • CHANNELS: 給出了關於channel的個數和名稱(ROOT總是擁有6個channels,而一般JOINT只有3個,較之ROOT缺少了XYZ的position資訊,因為子關節只需要根據它相對於父關節的偏移就可以算出它在座標系中的具體位置了)

參照:https://zhuanlan.zhihu.com/p/71818887