Dynamic Bone

Dynamic Bone插件的Unity Store鏈接地址:https://assetstore.unity.com/packages/tools/animation/dynamic-bone-16743

 

 

 

Dynamic Bone是一個Unity的動態骨骼插件,這個插件允許開發者指定對應的根骨骼,從而允許該骨骼的子骨骼進行物理結算,而根骨骼將不進行物理結算~~ 有一點要說明哦,DynamicBone模擬的物理結算不會導致骨骼距離發生變化~~也就是說,DynamicBone並不適合模擬凝膠、橡膠等各方向形變明顯的物體,這樣的物理模型更加適用於模擬頭髮呀、繩子啊等這些不容易拉伸但容易形變的物體,運用在衣物上時,則需要看衣物材質是否容易拉伸,如果容易拉伸依然不適合用~~

這個插件內含有兩個腳本,一個是Dynamic Bone,一個是Dynamic Bone Collider,好了我來一個一個的說明一下

— Dynamic Bone —

Dynamic Bone使用還是比較簡單的,導入Package之後,在Unity場景中選中需要計算的帶骨骼的GameObject,然後呢,在這個GameObject下面添加DynamicBone組件,然後將最上層的骨骼拖入到DynamicBone組件的Root上即可。然後設置各項參數,DynamicBone就會在物體發生運動的時候自動生效。要注意的是:

注意:因爲DynamicBone組件會在啓動時會記錄所有骨骼的局部座標並且在每次Update時還原局部座標,同時會根據所在的GameObject的移動計算骨骼的位置,所以添加DynamicBone組件的 GameObject不能位於應用DynamicBone的模型的骨骼中,就算是根骨骼也不行,如果這樣的話,在計算的時候會發生抖動或者直接崩潰~~

 

Dynamic Bone腳本

 

Dynamic Bone有四個基本屬性,決定了其運動效果,四個屬性的取值範圍都是[0, 1]:

 

  • Damping (阻尼):阻止簡諧運動的慣性運動,相當於彈簧的摩擦力。爲0時簡諧運動過程不會主動停止,爲1時簡諧運動過程不會發生;

  • Elasticity (彈性):決定回振移動強度,在簡諧運動過程中作爲額外的作用力將節點拉到還原位置,相當於彈簧的彈力。爲0時系統形變不會主動還原,爲1時形變不會發生;

  • Stiffness (剛性):限制最大振動幅度與方向,保證碰撞處理前節點不會跑到指定範圍外,相當於彈簧的硬度。爲0時不發揮作用,0到1時限制範圍從2倍原始距離到0線性衰減;

  • Inert (慣性):限制形變幅度,在每一幀的簡諧運動迭代發生前,無條件隨物體整體運動拉動節點,拉動距離爲Inert * 整體運動距離

其他的屬性說明:

  • Update (更新頻率):DynamicBone計算頻率,當遊戲實際幀率高於這個更新頻率時,DynamicBone會在每一幀進行消極計算,會盡量保持節點形狀,但不會進行簡諧運動模擬;當DynamicBone更新 頻率遠遠高於遊戲幀率的時候,DynamicBone會在腳本執行時嘗試追幀,但每次最多執行4次,也就是更新頻率實際最高只是當前遊戲幀數的4倍;

  • Radius (半徑):指定每個節點與DynamicBoneCollider發生碰撞的半徑,注意節點互相之間不存在碰撞關係,注意這個半徑是0碰撞依然會生效;

  • Damping\Elasticity\Stiffness\Inert\Radius各屬性的Distrib:指定屬性隨着節點深度遞增發生的變化;

  • End Length\End Offset 末尾節點偏移量:指定特殊的末尾節點End Bone局部位置,詳見下方的4.1. 關於EndLength和EndOffset;

  • Gravity 重力:在DynamicBone節點上施加的重力,方向是在全局座標系中的,注意DynamicBone的重力比較特殊,只在節點運動發生時起效,會在節點運動時把節點向重力方向拉動;

  • Force 常駐力:在DynamicBone節點上施加的額外力,方向是在全局座標系中的,注意Force與Gravity不同,是無條件生效的,會一直把節點向指定方向拉動;

  • Colliders 碰撞體列表:會與DynamicBone各節點發生碰撞的碰撞體對象,詳見2.1. 關於碰撞;

  • Exclusions 排除節點列表:在設置Root節點後,DynamicBone會根據節點的GameObject的父子關係沿着子GameObject方向自動生成節點樹,Exclusions中所有節點及其子孫節點都不會 生成DynamicBone節點;

  • Freeze Axis 固定軸:非None的情況下,所有節點在局部座標系的對應的軸上在值不會發生變化;

  • DistanceDisable 距離控制開關:開啓或者關閉距離控制機制,開啓後如果DynamicBone所在的物體超出了參考物體的參考距離範圍,DynamicBone的所有行爲都會停止;

  • Reference Object 參考物體:距離控制機制的參考物體,如果爲空則DynamicBone會選擇場景內的主攝影機作爲參考對象;

  • Distance To Object 參考距離:距離控制機制的參考距離

 

— Dynamic Bone Collider —

DynamicBone提供了簡單的碰撞功能,允許使用者禁止進入或者離開某些特定的區域,組件提供了球型和膠囊體兩種區域的碰撞體。碰撞功能的使用非常簡單,只需要在骨骼可能會發生碰撞交互的GameObject上添加DynamicBoneCollider組件,並且設置以下屬性:

Dynamic Bone Collider腳本

 

  • Center:指定區域中心與GameObject位置的偏移量;

  • Radius:區域內球形部分的半徑;

  • Height:區域高度,這個值在小於2倍Radius時無效,會使區域變成球型,高於2倍Radius時生效,區域會變成膠囊體(可視化模型是兩個球體);

  • Direction:膠囊體在當前GameObject局部座標的方向,區域是球體的時候無效;

  • Bound:區域模式,Outside表示區域會作爲碰撞盒與DynamicBone節點發生碰撞,阻止節點進入區域內,而Inside則會約束節點在區域內,阻止節點離開區域; 然後需要將DynamicBoneCollider對象添加至與其發生碰撞交互的DynamicBone組件的Colliders屬性中。

 

含有DynamicBone的效果

 

好啦~~今天這到這裏啦~~記得評論~~點贊~~轉發~~~

還有要說明一下:

使用限制和缺陷

  • 由於DynamicBone完全不發生拉伸和壓縮的特性,DynamicBone並不適合模擬凝膠、橡膠等各方向形變明顯的物體,而更適合模擬頭髮、繩子等不容易拉伸但容易形變的物體, 衣物則要看衣物材質是否容易拉伸,如果容易拉伸依然不適合用DynamicBone模擬;

  • 雖然有簡單的碰撞機制,帶DynamicBone組件的骨骼之間是不存在碰撞的(當然可以通過在各骨骼都設置DynamicBoneCollider組件來實現,但因爲開銷會很大所以不建議),所以,這意味着DynamicBone 模擬的物體在剛性爲0的時候可能會發生自我穿插;

  • DynamicBone的位置更新發生在LateUpdate節點,這意味着DynamicBone會完全控制節點的位置,其計算結果會覆蓋物理和動畫系統輸出的位置,而不能與其融合

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章