【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM