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】
・Inverse Kinematics with Animation Rigging (Unity 2020)
コメントを残す