天天看點

動态添加orderer節點_Unity 3D動态骨骼插件(DynamicBone)

前言

铛~铛~铛~ 提前祝大家新年快樂~~

今天的文章呢,來自于一位人美花兒甜的妹子——櫻花兔,在這裡先感謝下櫻花兔的分享~

動态骨骼

動态骨骼是遊戲内常見的一種表現方式,通常多用于頭發、服飾、飄帶等,而且在手遊中多出現于建立角色部分,可以産生在玩家拖動旋轉角色時頭發或飄帶随着轉動而飄動的感覺,以此來提升視覺品質。

那這種效果要如何實作呢?

其實實作方法很多,相應的插件工具也有不少,不過最出名最好用的莫過于一個叫Dynamic Bone的插件。

動态添加orderer節點_Unity 3D動态骨骼插件(DynamicBone)

Dynamic Bone插件的Asset Store連結位址為:https://assetstore.unity.com/packages/tools/animation/dynamic-bone-16743

動态添加orderer節點_Unity 3D動态骨骼插件(DynamicBone)

以上是我們利用Dynamic Bone實作的頭發甩動效果,是不是很棒呀~

Dynamic Bone是一個針對Unity的動态骨骼插件,這個插件允許開發者指定對應的根骨骼,進而允許該骨骼的子骨骼進行實體解算,而根骨骼将不進行實體解算~~  

有一點要說明哦,Dynamic Bone模拟的實體解算不會導緻骨骼距離發生變化,也就是說,Dynamic Bone并不适合模拟凝膠、橡膠等各方向形變明顯的物體,這樣的實體模型更加适用于模拟頭發呀、繩子啊等這些不容易拉伸但容易形變的物體,運用在衣物上時,則需要看衣物材質是否容易拉伸,如果容易拉伸依然不适合用。

Dynamic Bone

這個插件内含有兩個腳本,分别如下:

  1. Dynamic Bone
  2. Dynamic Bone Collider

好了,我們來一個個的說明一下.

Dynamic Bone

Dynamic Bone使用起來還是比較簡單的,導入Package之後,在Unity場景中選中需要計算的帶骨骼的GameObject,然後呢,在這個GameObject下面添加DynamicBone元件,然後将最上層的骨骼拖入到DynamicBone元件的Root上即可。然後設定各項參數,DynamicBone就會在物體發生運動的時候自動生效。 需要注意的是: 由于DynamicBone元件會在啟動時記錄所有骨骼的局部坐标并且在每次Update時還原局部坐标,同時會根據所在的GameObject的移動計算骨骼的位置,是以添加DynamicBone元件的 GameObject不能位于應用DynamicBone的模型的骨骼中,就算是根骨骼也不行,如果這樣的話,在計算的時候會發生抖動或者直接崩潰~~

動态添加orderer節點_Unity 3D動态骨骼插件(DynamicBone)

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元件,并且設定以下屬性即可。

動态添加orderer節點_Unity 3D動态骨骼插件(DynamicBone)
  • Center:指定區域中心與GameObject位置的偏移量;
  • Radius:區域内球形部分的半徑;
  • Height:區域高度,這個值在小于2倍Radius時無效,會使區域變成球型,高于2倍Radius時生效,區域會變成膠囊體(可視化模型是兩個球體);
  • Direction:膠囊體在目前GameObject局部坐标的方向,區域是球體的時候無效;
  • Bound:區域模式,Outside表示區域會作為碰撞盒與DynamicBone節點發生碰撞,阻止節點進入區域内,而Inside則會限制節點在區域内,阻止節點離開區域;然後需要将DynamicBoneCollider對象添加至與其發生碰撞互動的DynamicBone元件的Colliders屬性中。
動态添加orderer節點_Unity 3D動态骨骼插件(DynamicBone)

好啦~~

今天就到這裡啦~~記得評論~~點贊~~轉發~~~

還有要說明一下,使用限制和缺陷:

  • 由于DynamicBone完全不發生拉伸和壓縮的特性,DynamicBone并不适合模拟凝膠、橡膠等各方向形變明顯的物體,而更适合模拟頭發、繩子等不容易拉伸但容易形變的物體, 衣物則要看衣物材質是否容易拉伸,如果容易拉伸依然不适合用DynamicBone模拟.
  • 雖然有簡單的碰撞機制,帶DynamicBone元件的骨骼之間是不存在碰撞的(當然可以通過在各骨骼都設定DynamicBoneCollider元件來實作,但因為開銷會很大是以不建議),是以,這意味着DynamicBone 模拟的物體在剛性為0的時候可能會發生自我穿插.
  • DynamicBone的位置更新發生在LateUpdate節點,這意味着DynamicBone會完全控制節點的位置,其計算結果會覆寫實體和動畫系統輸出的位置,而不能與其融合.

最後

歡迎關注Unity技術美術公衆号:

Unity技術美術

更多幹貨

動态添加orderer節點_Unity 3D動态骨骼插件(DynamicBone)

讓我知道你“在看”

動态添加orderer節點_Unity 3D動态骨骼插件(DynamicBone)