初めに
これはVRChat向けの記事です。
VRChatにおけるUnityを前提として書いているため、一般的なUnityとは乖離しているケースが多々含まれます。ご注意ください。
本来の使い方
本当に初心者の人が勘違いしたらいけないので載せておきます。
ラグドールの設定サンプル(Full Body Biped IK)
3D空間でお絵かき (VR IK)
NPCシステム(Aim IK)
前提知識
この記事では以下の知識を前提としています。
- 基本的なUnity操作
- VRC物理学(Fixed Jointによるサブアーム、ワールド固定)
- 筆者の拙い文章を理解する読解力と根気
やりたいこと
VRCユーザーが
「Final_IKがセールだ!買え!」「ところで何に使うものなの?(笑)」
と言っているのを見かけたので、何かしらの利用方法の提示。
- Limb IK の導入方法(超特殊構造)
- オブジェクトの持ち替え
- Fixed joint を使わないワールド固定
完成品prefab
持ち替えとワールド固定(置きなおし可能、エモートスイッチ設定済)
- Aim IKを使ったオブジェクト一括管理
完成品prefab
パーティクルライブとかの演出に使えるかも?
- 他の記事等を紹介
メリット
- IKを使うため、関節がいい感じに曲がってくれる
- Fixed JointやRigidbodyの数を減らせる
- VRC上でのアバターパフォーマンスの仕様につよい!
デメリット
- 価格が$90と高い(セール中なら半額程度で買えます)
- 日本語の情報が少ない
- VRCのアップデートで挙動が変わる可能性がある
Limb IK の導入方法(超特殊構造)
以前Twitterでまとめたもの(以下リンク)があるので、現在の仕様に合わせて少し調整して記事にしてます。
Final IKhttps://t.co/dvOepItqcq
— スーパー甘党 (@Super_Amatou_VR) February 17, 2019
の一部の機能 Limb IK を使い以下を軽量化しましょう。
・オブジェクトの持ち替え
(is activeを使わず持ち替えるのでメッシュが節約できるしアニメーション管理がしやすい)
・Fixed joint を使わないワールド固定
(rigid body を使わないので軽量。)
Limb(四肢)を制御するComponentのため、本来の使い方ではありません(VRCにありがち)。
これを使う事で従来は手などのボーンに直接格納していたオブジェクトをArmatureの外に出し、浅い階層で管理できるので、複雑なアニメーション作る際などに便利です。
オブジェクトの持ち替え
早速、以下の通りに Chest(肩)から Right hand(右手)にcubeを持ち替える構造を作っていってください。
VR IK
アバターのルート(Pipeline ManagerやVRC_AvatorDescriptorがあるところ)にVR IKコンポーネントをアタッチします。
Humanoidに適合したアバターであれば、Referencesの欄が適切に設定されるはずです。
すべての項目が埋まっている事だけを確認して、問題がなければ他の項目はそのままで大丈夫です。
VRCに上書きされるので設定は気にしないでいいです。
2019/11/17現在上書きされない設定になってるようです。とりあえず、以下の値に。1
fix Transformを外す
IK Position Weightを0に
Plant Feetのチェックを外す
Locomotionの Weight を0に
Velocity Factor を0に
Full Body Biped IK1
同様にアバターのルートにFull Body Biped IKをアタッチします。
VR IK同様に、Refarencesが埋まっている事だけを確認します。
その際に下図のようにボーンに走っている線が青色になっているかも合わせて確認します。
線に赤色が混ざっている場合、関節どちらの方向に曲がればいいのかFBBIKが認識できてない状態です。
この場合はUnity上で構わないので、膝に微小な角度(0.1度くらい)をつけてあげることで正常な状態(青色)になります。
この際、関節が曲がるべき自然な方向に角度をつけます。
それ以外の設定はデフォルトのままで構いません。
こちらも調整するべきかもしれません。が、取り敢えず、ギミックは動くのでギミック部分が出来上がってからIKの調整をする、と言う方針が良いかと思われます。
VR IK同様、FBBIKコンポーネントのチェックボックスも外しておきます。
IK Execution Order
同様にアバターのルートにIK Execution Orderをアタッチします。
IK ComponentsのSizeを2にすると、その下に入力欄が2つ出現します。
1つ目の入力欄(Element 0)にVR IKを、2つ目の入力欄にFBBIKをセットします。
Inspector内のコンポーネント名を直接ドラック&ドロップでセットできます。
以上の操作でIKの実行順序を設定することで、VRC上での挙動の安定化を図っています。
(これをしないとLimb IKの挙動が安定しません。)
IK設定用の関節
Armature の外に(つまりボーンの影響を受けない位置に)右クリックcreate emptyをしてGame objectの多重構造を作り
To chest
∟To right hand
Limb IK root1
∟Limb IK root2
∟OBJECT
といった風にリネームする。(分かりやすいようにこのようなネーミングなだけで、1、2、3とかでも全然OKです)
root2を座標をずらし(0,1000,0)、OBJECTで位置を戻し(0,-1000,0)、関節の長さを設定します。
そして OBJECT の中に右クリックで cube を置き、position(0,0,0)にします
これで動かす cube の設定は終わりです。
続いて肩に追従する時にはどの位置にあるのか、手に追従する時にはどの位置にあるのかを設定していきます
OBJECT を ctrl + D で複製し、出てきた OBJECT (1) を使って位置調整します。
まずは chest から右クリック、create emptyを二回してGame object を作成しChest(Limb)とChest_IKにリネームする。
そしてさっきの OBJECT (1) を Chest(Limb) の子に置く。
Armature
∟Hips
∟Spine
∟Chest
∟Left shoulder
∟Neck
∟Right shoulder
∟Chest(Limb) ←(New)!!
∟Chest_IK ←(New)!!
∟OBJECT (1)
∟cube
そして Chest(Limb) ごと動かし位置調整します。
同じように右手首にも、create empty、リネーム
Right wrist
∟Right hand (Limb)
と設定し、位置調整後、OBJECT (1) は必要ないので Delete してください
Limb IK
Limb IK をTo chest と To right hand にadd component し、画像のように設定します。
- fix Transformを外す
- bone1 2 3 に Limb IK root1 Limb IK root2 OBJECT をドラッグ&ドロップ
- Target にTo chestにはChest_IKをTo right handにはRight hand_IKを。
追記:Chest_IK等Targetに指定するオブジェクトにVRC IK_followerを付ける。 - Avatar IK Goal を Right hand に(今回は右手なので。左手ならLeft hand で)
- Bend Modifier を Target に
お疲れ様です以上で設定終わりです。
再生ボタンを押して Limb IK のコンポーネントをON/OFFすると IK が変更されます。
To chest が enable かつ To right hand が disable 状態にあると肩に背負い
逆だと右手に持ちます
Fixed joint を使わないワールド固定
先ほど設定した Limb IKのターゲットを none にします。
Limb IKをdisable状態にします
以上です。
Limb IK がenableになった場所にワールド固定されます。
一度ワールド固定するとdisableにしても IK 情報を与える Target が none なので動きません。
なのでLimb IK を多重構造にしておく事で、別途他の Limb IK から手元に引き寄せるようにしないといけません。
置きなおすことが出来ませんが、逆に言えば IK の情報がないというのが複数保存されるので Target が none のLimb IKを複数用意しておくことでワールド固定の箇所を複数個所切り替える等ができます。
ワールド固定する瞬間にワールド固定するゲームオブジェクトの子階層でLimb IKで手元に引き寄せ即IK無効化で再度置きなおしを再現出来ます。
Rigid bodyを使わないのでワールド固定をするオブジェクトにコライダーを含む場合、コライダーがRigid body colliderに変化して挙動が変わったりしないので管理しやすい。
Aim IKを使ったオブジェクト一括管理
お借りしたもの
noribenさんのビームライトシェーダーとモデルをお借りしました。
https://noriben.booth.pm/items/1637978
完成品チラ見せ
Aim IKを使ったオブジェクトの一括管理。
— スーパー甘党 (@Super_Amatou_VR) November 11, 2019
パーティクルライブとかの演出作成のアニメーション管理が楽になると思います。 pic.twitter.com/5hQtVXdfqj
完成品prefab
https://superamatou.booth.pm/items/1669811
作っていく
Game objectを分かりやすいようにLight Groupとリネームします。
子階層にビームライトを複数個、等間隔に並べます。
下準備
アバターに仕込む場合は、Limb IKの項目と同じように、VR IK,FBB IK,IK Execution Orderを設定してください。
ターゲット用のオブジェクト作成
それぞれのビームライトの先端付近になるようにCreate emptyします。それぞれの高さは揃えておいてください
作ったオブジェクトをビームライト自体のTransformの影響を受けないように階層を変えます。
Aim IKの設定
IKの設定をする為にCreate emptyして画像のように設定します。
今回は90度向きを変えているビームライトの真上にターゲットが有る為、Axis(1,0,0)です。
Aim Transform,Targetの位置関係に応じて値を変えて下さい。
他の記事等を紹介
VR IKを自前で設定する
https://qiita.com/TyounanMOTI/items/4a68b9b2123baa867924
ワールド用のラグドール等の設定値
https://twitter.com/ayr_suzu/status/986285883958558725
海外のVRC向けFinal IKまとめてる方々
https://www.youtube.com/channel/UCgZrhtmeno1qwrQFUQg4J0g
https://www.youtube.com/channel/UCmBh1L02HuuKoWrSXsLhCKw
VRC向けではないが(script使用)丁寧に解説してる記事
https://lowpolycat.com/unity_asset1/
同じくVRC向けではない
http://miyas-maincontents.blogspot.com/2016/11/final-ik.html
まとめ
IKの実行順序
- VR IK
- Full Body Biped IK
- IK Execution Order
以上のコンポーネントをアップロード前に事前にアタッチしておくことで、IKの実行順序を明示的に指定できる。
事前にアタッチしなかった場合は、VRC上で自動的にアタッチされるが、その場合は実行順序が明示されない。
なぜIKの実行順序が重要なのか
今回の機構は、以下のロジックに基づいて多脚を実現しています。
- ダミーのHumanoidボーン(UpperLeg.R, UpperLeg.L)が動く(VR IK、FBBIKによる)
- ボーンについているRigidbodyを元にFixed Joinedが連動して動く
- Fixed Jointをtargetに指定したLimb IKが動く
VR IKやFBIKより先にLimb IKが動いてしまうと、上記のロジックが正しく動作せず、動きがぎこちなくなってしまいます。
IK制御の優先度はVR IK, Full Body Biped IK>Limb IK
ウェイト未割り当てボーンの除去の補足です。
VR IKやFull Body Biped IKの制御下にあるボーンは、Limb IKで制御できません。
これについては、以下の記事に詳しく書いてあります。
https://qiita.com/TyounanMOTI/items/4a68b9b2123baa867924
補足
以下はメモ的なものです。
参考程度に捉えてくもらえると。
ネットワークIK
- 自分以外のアバターは角度情報だけを取得している?
- 仕様変わるらしいです。
VRC IK_follower
- VRC SDK内に入っている script
- このコンポーネントを付けたGameObjectのTransformは、Position(0, 0, 0), Rotation(0, 0, 0), scale(1, 1, 1)に上書きされる
位置調整をしたい場合には親にofset用のGameObjectを挟むと良い - RigidbodyやIK同様、座標計算をするコンポーネント
- コンポーネントが非アクティブになっている間は計算が停止
- 結果として、オンオフするたびに位置がズレる可能性有
- Fixed Joined を使わずに、ワールドパーティクルを仕込むことが出来る
- こちらが本来の用途、詳しい実装方法は別途紹介
- 手首の子階層に空のGameObjectを設置し、VRC IK_followerを付けることで他者の視点でも同期するようになる
- 結果、他人視点でも同期するIKのTargetとして利用できる
Limb IK
- Limb(四肢)の名前の通り、本来は手足を制御する為のモノ
- VR IKなどHumanoidを想定したIKでは2本の脚しか制御できないが、Limb IKは設定したボーンのみを制御するため、それぞれの脚ごとにLimb IKを用意することで多脚に対応可能