BVH檔案格式解析

CopperDong發表於2018-04-20

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   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116

頭部部分

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

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

  3. BVH檔案的格式為遞迴的格式,層次結構的每一個segment包含了一些相關資料,該segment要遞迴定義它的子segment.

  4. 關鍵詞”ROOT“後以大括號開頭,下行以tab填充,能夠增加可讀性.

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

  6. BVH檔案中沒有明確的資訊能夠描述一個segment該怎樣畫,通常通過從第一個segment的偏移量來定義父segment,典型的,只有ROOT和上部主體的segment將有多個子segment.

  7. 接下來一是”CHANNEL“頭部資訊,後面跟著的數字表明channels的數目,後面的標籤表明每一個channel的型別.

  8. 一個BVH檔案解析器必須跟蹤channel的數目和channel的型別,在後面MOTION資訊被解析的時候,這個順序在解析每一行的MOTION資料的時候需要用到.這種格式規定很明顯具有靈活性,能夠允許segment擁有任何數目的channel,且能夠按照任何順序.

  9. channel旋轉的次序是:Z X Y,

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

  11. END SITE結束了遞迴,它的定義還包含了一些資料,它提供了前segment的長度,就像前面子segment提供了offset用於繪製父segment的長度和方向

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

資料部分

  1. 資料部分以”MOTION”“*開頭,後面的數字表示了幀率,下一行”**Frame Time“定義了取樣頻率

  2. 檔案剩餘的部分包含了motion的資料,每一行是一個motion資料的樣本, The numbers appear in the order of the channel specifications as the skeleton hierarchy was parsed.


關鍵詞

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

注意

  • rotation channel的順序是:Zrotation Xrotation Yrotation
  • BVH格式的運動採取的旋轉方式比較特別 
    -End Site 表示終結遞迴,該關節的定義到此為止,可看作一個終端效應器
  • 資料塊以 MOTION 關鍵字開始 
    -Frames: 定義幀數,Frame Time:定義資料取樣速率-每幀的時間長度,如0.033333則表示BVH檔案的一般取樣速率,每秒30幀
  • 接下來的資料就是實際的運動資料,對應骨架資訊的層次結構
  • 對於子關節來說,平移資訊儲存在骨架資訊的OFFSET中,旋轉資訊則來自於MOTION部分;
  • 對於根結點來說,平移量是OFFSET和Motion section中定義的平移量之和。
  • BVH不考慮Scale變換。

資料

計算segment的位置,需要從區域性的平移和旋轉資訊建立一個變換矩陣.對於任何joint,平移的資訊將會是層次部分中定義的offset,旋轉資訊則從motion部分得到

對於根ROOT,平移資料為offset的總和,而旋轉的訊息來自motion部分,BVH不需要考慮比例因子的計算.

建立變換矩陣的直接方法是建立3個單獨的旋轉矩陣,每個矩陣對應每根軸 VR = vYXZ


解析器

可以參考:BVH java解析器


參考

Biovision BVH


謝謝


相關文章