在IK鏈中實現拉伸效果之早古方法

2021-08-28 05:47:30 字數 1885 閱讀 9842

在構建身體骨骼繫結的時候,手腳腰腹部都對繫結有拉伸效果的需求,在此總結乙個很古早的拉伸實現方法,利用骨骼的單軸向的縮放實現ik鏈的拉伸效果。

在ik鏈中,我們通過對ik曲線的控制來控制骨骼的運動來實現,所以我們需要做的就是在曲線伸縮的同時使骨骼也同步伸縮,此時我們就可以利用曲線的長度的變化來確認骨骼縮放的倍數,只需運用如下的數學公式:

joint scale = current curve length / original curve length

獲取曲線的長度資訊

選擇曲線並執行下列mel語句,給曲線新增乙個節點 curveinfo:

arclen -ch 1;
然後選擇此節點,開啟屬性編輯器,就可以看見 arc length 屬性;

設定骨骼的縮放

在這裡有兩種方法可以實現:

1.寫表示式:

假設縮放的軸向為x軸,並已知曲線原始長度為18.432

//curve scale expression

float $scale = curveinfo1.arclength / 18.432;

back_1_joint.scalex = $scale;

back_2_joint.scalex = $scale;

back_3_joint.scalex = $scale;

//...........

//back_x_joint.scalex = $scale;

2.直接使用乘除節點:

建立乙個multiplydivide節點,並做如下圖鏈結

然後把曲線的原始長度填寫在multiplydivide節點的input 2屬性裡,並將operation屬性修改為divide,如下圖所示

就此完成ik鏈伸縮功能!

ps:同時設定其他兩個軸向的縮放可以實現在伸縮的同時又有體積的變化,如下圖

利用指數函式就可以實現我們需要的體積變化,表示式實現如下

back_1_joint.scalez = pow($scale,1);

back_1_joint.scaley = pow($scale,1);

back_2_joint.scalez = pow($scale,1.3);

back_2_joint.scaley = pow($scale,1.3);

back_3_joint.scalez = pow($scale,1.5);

back_3_joint.scaley = pow($scale,1.5);

back_4_joint.scalez = pow($scale,1.3);

back_4_joint.scaley = pow($scale,1.3);

back_5_joint.scalez = pow($scale,1);

back_5_joint.scaley = pow($scale,1);

//................

//...............

(1,1.3,1.5,1.3,1)所實現的變化曲線可能不夠完美而且不方便調整,可以考慮利用獲取非線性動畫曲線的數值來實現這個功能。

在 iOS 中實現區塊鏈

本文參考 區塊鏈 blockchain 是位元幣等流行的加密貨幣背後的技術。區塊鏈的主要概念是去中心化,提供分布式賬本。本文會為你展示如何在 ios macos 中使用 swift 語言建立最基本的區塊鏈。注意 本文不涉及節點 nodes peers 驗證和獎勵等。我會用 macos playgro...

在VB中實現窗體的動態效果

在vb 中實現窗體的動態效果 在vb程式設計中,應用程式窗體的出現和關閉一般都是靜態的,不過,我們利用下面的乙個api函式animatewindow就可以輕鬆實現窗體的動態效果。api函式animatewindow的宣告如下 private declare function animatewindo...

在Vue中實現打字機的效果

前一段時間找工作做網頁簡歷,想實現打字機的效果。按理說像打字機這種動畫效果的實現首選是jquery,畢竟jquery還是以操作dom為主,而vue是資料驅動,但是jquery並沒有能狗滿足我設想的功能的外掛程式,又偷懶不想自己實現雙向繫結,只好自己用vue實現。寫的不是很漂亮,希望大家不喜勿噴,這裡...