Unityの逆運動学(IK)の勉強のために、3つの箱が並んだだけのロボット(?)をIKで動かすというところまで試せましたので、その覚書を作りました。

ある程度、Blender やUnityがわかっている人向けの情報になりますのでご了承ください。

Blenderでモデルを作る

Blender を使ってモデルを作った。ここでは、操作が思い出せるように限定的なショートカットを記述するのみにとどめる。

3つの箱が並んだだけのロボットを一つのオブジェクトとして作る。

軌道画面で、lightとcameraを選択して[delete]消去。中心の箱だけを使う。

[オブジェクトモード]で、箱の大きさを [s][x]と[s][y]でx軸方向、y軸方向のスケールを整える。[g][z]で上下を移動させ、ワールド原点(赤と白の円)が箱の下に来るようにする。

この箱を、[shift]+[d] でコピーして2つ目の箱を作り、[z]でz軸の上方向に動かし位置を整える。

同様に3つ目の箱もコピーして一番上に配置する。

最後、[a]で3つの箱を選択して、[ctrl]+[j] で統合する。

作成したオブジェクトに、シーンコレクションで、ThreeBoxと名前を付ける。

次に、TheeBoxの原点を移動する。

[オブジェクティブモード]でThreeBoxを選択し、[n]でサイドバーを開き、ツール>オプション>トランスフォーム>影響の限定> 原点にチェック

[g][y]で原点(オレンジの点)をThreeBoxの一番下に移動させる。

(※これをしないと、Unityで表示させたときに、ThreeBoxの原点とBoneの原点の間に大きくboneが表示されてしまう)

原点の移動が済んだので、原点の☑をはずす。

次に、ボーンを作っていくが、ボーンが見えるように、右上のアイコンを下のようにして、ワイヤーフレームにする(アーマチェアを見えるようにするため)。

左上のメニューから、追加>アーマチェア、で、原点にボーンが出現する。

[編集モード]にして、ボーンの上のとんがりにカーソルを当てて [g][z](移動、z軸に拘束)で、ロボットが曲がる箇所まで伸ばして左クリックで位置を決める。

そのまま[e][z](伸ばす、z軸に拘束)を押すと、次のボーンがz軸に沿って発生するので、大きさを調節し左クリックで位置を決める。同様にして、図のような3つボーンを作る。

次に、ボーンと箱の関連付けをする。

[オブジェクトモード]にして箱を選択し、[shift]を押しながらボーンも選択する。

[ctrl]+[p]でペアレント対象のメニューが出るので、[アーマチェア変形 自動のウェイトで]を選択。

シーンコレクションを見ると、アマチュアーの下の階層にThreeBoxが移動していることがわかる。そして、ThreeBoxの下に、モディファイヤーと頂点グループというコンポーネント(?)が付加されていることもわかる。

ボーンの確認をする。

[オブジェクトモード]でボーンを選択し、[ポーズモード]にして、動かしたいボーンを選択、[r]を押すとマウスでボーンの方向と箱が追従して曲がる。これでOK。

曲げた関節を元に戻すには、[a]で全選択して、[alt]+[r]を押す。

データをエクスポートする。

オブジェクトモードで全選択

ファイル>エクスポート>FBX

下の赤枠のように設定をして、保存場所とファイル名を指定し、FBXをエクスポート。「箱3つロボ.fbx」とした。これでモデルができた。

Unityで動かす

Unityで、3Dでプロジェクトを新規で作成。ここで使ったバージョンは、2020.3.32f1。

箱3つロボ.fbx をAssetsにドラッグ&ドロップ、それをSceneにドラッグ&ドロップ。

箱3つロボのPosition を x 0, y 0, z 0 にする。

カメラのPositionは、x 0, y 5, z -12にする。

Planeを加えて、Positionをx 0, y 0, z 0とし、Scale を x 10, y 1, z 10としする。

Materialを作り、緑色にして、Planeに関連付ける。

Animation Rigging をインストールする

Window > Package Manager > Animation Rigging > Install

Bone を可視化する。

箱3つロボを選択し、Animatin Rigging > Bone Renderer Setupで、Boneが表示される。Bone Renderer というコンポーネントが付加されていることがわかる。この、Bone Size でBoneのサイズを調節できる。

箱3つロボを選択して、Animation Rigging > Rig Setupとすると、

コンポーネントに、Animator とRig Builder が追加される。

Hierarchyを確認すると、箱3つロボの下に、Rig 1 というオブジェクトが追加さえている。

この下に、空のGameObjectを作り、Headという名前にする。

このHeadを選択し、Inspector のAdd Componentを押して、Two Bone IK Constraint を追加する。

作成したTwo Bone IK ConstraintのTip に、Bone.002_end をドラッグして関連付ける。そして、Two Bone IK Constraint の右の「三つてんてん」をクリックし、「Auto Setup from Tip Transform」を選ぶと、RootとMidにも自動で関連付けが行われ、Head の下に「Head_target」と「Head_hint」というオブジェクトが作られる。

ロボットが姿勢を合わせるターゲットが、Head_Targetになる。このプロパティーを設定する。

head_targetを選択し、Sneneの下に表示されているAnimatin Rigging の+ボタンを押す。

Shapeを、BoxEffector にし、Sizeを 0.5とし、Sceneで表示されている矢印を動かして、ロボットの上側に配置する。

これで最低限の準備はOK。実行ボタンを押すとロボットが縮こまる。これは、Head_targetの位置が、原点にあるから。

HeirarchyでHead_targetを選択して動かすと、ロボットがその位置に頭がくるように動く。これぞIK。

ただ、実際のロボットでは、通常関節は一つの方向しか回転しない。

そういった制限の方法はどうやるのかを今後調べていきたい。

参考

初心者入門・ボーンとウェイトペイント解説【blender2.82】

はじめての3Dモデリング Blender 3 超入門

Inverse Kinematics with Animation Rigging (Unity 2020)