【Godot】2DスケルタルのボーンとIKを入れるまでのメモ

# 概要
この記事は、2Dスケルタルアニメーションについて調べたことの個人的なメモとなります

# カットアウトアニメーションのメモ
以下は、「[Godot Docs » アニメーション » カットアウトアニメーション](https://docs.godotengine.org/ja/stable/tutorials/animation/cutout_animation.html#doc-cutout-animation)」のメモとなります

## 回転のショートカットキー
`キーボードのE` で「回転モード」に切り替えることができます。
「選択モード」に戻すには、`キーボードのQキー` (移動のみなら `キーボードのW`)

（※パーツが多いとショートカットキーを駆使することになるので、覚えておいたほうが良さそう）

念のため、便利そうなショートカットキーのまとめ

* **選択モード**: Q
* **移動モード**: W
* **回転モード**: E
* **拡大縮小モード**: S
* **パーツ選択**: Alt+右クリック

`Alt+右クリック` はパーツが重なっている場合、ポップアップで選択できるというスグレモノ
（**※ただし `Qキー`などで選択モードに戻す必要がある**)
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/075abd50-e49c-afd1-a8ba-ac3f7284d165.gif)

また、操作を間違えた時のUndoは`Ctrl+Z` (`Cmd+Z`) 、戻しすぎたときのRedoは `Ctrl+Shift+Z` (`Cmd+Shift+Z`)

## 中心(ピボット)の調整方法
`Offset > Offset > x/y` の値を変更して中心(ピボット)を移動させます

ピボットの変更はここから「ピボット編集モード」にすると編集が楽にできます
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/056b2d13-37b2-cd54-6496-b2f86172ed65.png)


## パーツの描画順の調整
`Z Index` の値で調整できます。ただし、マイナスを使うとわかりにくくなりそうなので、最低値を「0」になるようにしたほうが良いのかもしれない……
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/06c67a19-9c61-7457-29b7-0a6d87ba1e55.gif)

## ボーンを入れる方法
ボーンはノード単位で行われるため、先端のノードが個別に必要になります。
（例えば腕の場合、「上腕」と「前腕」だけだとIKで動かすためのボーンが不足する）
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/e0e1cd66-0f2c-2820-2827-074fdb4ae1fa.png)

`Position2D` を前腕の先端に配置することで、「前腕から先端までのボーン」を作成することが可能になります。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/b0c903e6-7b5c-47ae-6b2b-6b94f6ac042a.png)

ボーンを入れるには、まず対象のノードをShiftキーを押しながら選択します。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/7ab0047e-c5b0-e8d0-88cf-aef71087ebbb.png)

そして、「ホネのアイコン」をクリックして、「ノードからカスタムボーンを作成」を選びます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/6a9ffd9b-eddd-f9aa-f8fc-7bd91269d9cb.png)

するとこのようにボーンが作成されます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/9987e58c-dd1a-4c1d-cfb0-3e99989b5d7f.png)

### IKを設定する
対象のノードをShiftキーを押しながら選択します。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/7ab0047e-c5b0-e8d0-88cf-aef71087ebbb.png)

再び `ホネのアイコン > IKチェーンを作成` を選択します。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/e6608e9e-95c5-4c83-dc2b-46a7232fe2d9.png)

IKを設定すると、このように先端のノード(`Position2D`)の動きに合わせてIKを設定したボーンが動くようになります。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/41c59a04-bb00-dd98-7aa1-f661df1473f8.gif)

#### IKのオフセットを調整
これだと回転がおかしいので、人間の関節にあたる部分のピボット(回転の中心)を `Offset > Offset` から調整する必要があります。
ただし、IKとボーンの指定を解除する必要があるので、調整前には事前に解除しておきます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/e1ef2450-56b2-9673-9726-ac542052da4f.png)

ここからピボット編集モードに切り替えます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/fc40f0fb-a7db-7dc8-19ed-8da413161782.png)
ピボット編集モードにすると、ピボットが簡単に編集できます。
`キーボードのE`で回転モードにすると、修正したピボットの確認も楽にできます。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/b32b0f85-192a-a53e-5f83-fd03d8d69752.gif)
編集したくないパーツのピボットを選んでしまう場合は、対象のパーツをいったん非表示にしておくと、簡単に編集できます。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/a16ff432-86dc-e200-e8bb-fc1eafe5985a.gif)

もしくは「子を選択不可にする」モードで編集してもよいかもしれません。
![Godot_Engine_-_TestTree____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/e6bcbcbc-d236-a774-2ad0-a5ce053f370a.png)

……というような調整を繰り返すと、以下のようなIK処理が作れるようになります。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/8b28013d-faf1-b9b0-f13d-94560b56bc3d.gif)

# アニメーションの作成
アニメーションをつけるには、`AnimationPlayer`を追加します。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/30d75d21-4a03-a72d-e0a0-b9c35eb44ab6.png)

## アニメーション作成前に理解しておきたい設定
公式ドキュメントにも記載されていますが、アニメーション作成する際、以下の設定をしておくと作りやすくなります。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/07eabae1-8f95-1292-76f2-fdf6dedf0b53.png)

1. 移動を無効にする
2. 回転のみ有効にする
3. 自動でキーフレームを追加する

ただ、移動させたい場合や、キーフレームを手動で追加したい場合もあるかもしれないので、そのときは設定を切り替えるようにします。
以下の説明はこれらの設定がされているものとします。

### アニメーションの作成
アニメーションを作成するには、画面下のアニメーションエディタから「アニメーション」をクリックします。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/bbcdc679-3dba-9509-ed9a-a24d55d1d735.png)

すると、ポップアップが表示されるので「新規」を選びます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/4f9e3e4f-235e-6dbc-cadc-08e65cb35c40.png)

新規アニメーション作成ダイアログが表示されるので、「attack」と入力して「OK」をクリックします。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/d2503e6e-635c-3689-92cd-7cb1e688bf3c.png)

アニメーション「attack」が追加されたのを確認して、「トラックを追加」をクリックします。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/26ca44b3-705f-d7b3-2799-33c86172553a.png)

「プロパティトラック」を選びます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/9264fede-ae22-66f4-2f12-a9202d128b3e.png)

対象ノード選択ダイアログが表示されます。
今回は右腕を回転させるので、「gBot_arm_r」を選びます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/4fb3ebab-4044-c304-8702-a56fdfd9e6cb.png)

プロパティは `rotation_degress` (回転値) を選びます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/c750cf35-f3ba-e689-5902-f48db5398bf0.png)

すると、`gBot_arm_r > rotation_degress`トラックが作成されました。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/64192331-2b83-75dd-dd16-f0d2dfa6eb99.png)

モーションの時間が初期状態だと 1秒なので、2秒に増やしておきます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/0f5a0d63-b792-6c60-0390-9aeab8e571af.png)

次にトラックのシークバーを 0秒 に移動させておきます。その上にある数値入力ボックスに「0」と入れても移動できます。
シークバーを移動できたら、トラックのシークバー(青い線)の上で右クリック「キー挿入」を選びます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/8d9c6383-ba75-e867-7c48-0a874ce90211.png)

するとキーフレーム（白い丸）が配置されます。もしずれて配置される場合はマウスのドラッグで移動させたり、右クリック→削除してから再配置してみたりします。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/3f64598d-3b0b-d7ee-af95-33edb45ba8fa.png)

次に 「2秒」 の下あたりのトラックを右クリックしてキーフレームを追加します。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/c5f68d5c-d97c-c429-8fe6-44d5e02a24a3.png)

そしてシークバーを「1秒」にドラッグで移動させます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/a28eb3a7-1ee6-81d1-2b63-003123a3a1f3.png)

シーンツリーから「gBot_arm_r」を選択して、回転モード（`キーボードのE`でも変更可能)にします。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/5448eafb-b6ab-3c1e-7544-a991306208ee.png)

そしてマウス操作で右腕を回転させます。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/1118ed8e-2be3-4e6e-fbf2-278df39b014c.gif)
マウスを離すと同時に、「1秒」のところにキーフレームが追加されています。

シークバーをドラッグしたり、再生ボタンを押してアニメーションの動作を確認します。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/a66e04c9-ecee-4978-2e19-280061e602b0.gif)

### IKのアニメーション制御
右腕にはIKを設定しておいたので、IKを使うことにします。
先程のトラックは「ゴミ箱アイコン」をクリックして削除します。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/6ad603ad-b7f7-79ba-25f0-b88b7d6bd38f.png)

シークバーを0秒に移動させて、IKの終端ノード（ここでは 「Position2D」）を選びます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/ff129977-0b4b-987c-a5d0-d330cd7368c0.png)

そして上にある「カギアイコン」をクリックします。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/afc673b8-7259-152c-ff4d-5d21012d074f.png)

IKに関係あるノードのトラックをまとめて作成する確認ダイアログが表示されるので、「作成」ボタンをクリックします。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/ca3c8e16-15e9-26c9-a43c-326f5c8fcf68.png)

すると、関係する親ノードのトラックがまとめて作成されます。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/659cbd6a-2053-a26f-312f-be977d35f04b.png)

次に以下の操作を行います。

1. 0秒のキーフレームをドラッグですべて選択
2. シークバーを2秒に移動
3. 編集ボタンをクリックして「選択範囲を複製」を選ぶ

![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/5a3f36df-3ebc-6602-421a-defcc6036b89.gif)

すると0秒のキーフレームが2秒の位置に複製されます。

そうしたら、シークバーを1秒の位置に移動します。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/d46d4529-8aa5-eb09-1e5d-2250abb52fbf.png)

さらに操作モードを「移動モード」（`キーボードのWキー`でも変更可能）にします。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/48fb5c5c-363e-52c3-855b-99f69fe9e5c9.png)

そして IKの終端ノード（ここでは Position2D)を移動させます
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/d497a431-b1e4-6850-de81-008dd2b4dd51.gif)

すると自動でキーフレームは追加され、シークバーを移動させたり再生ボタンをクリックすると、アニメーションが確認できます。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/544c18b9-1a7b-8b66-600b-322d8ce7ad04.gif)

ちなみに自動で作られたIKの終端ノードの回転値のトラックは削除しても問題なさそうです。
![Godot_Engine_-_TestCutOut_-_gBot_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/d3a5e380-9fcd-415a-c9ef-5517ab72db0a.png)

このようにIKアニメーションができました。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/83045e65-e1b7-1122-c8c5-20868a1b20dd.gif)

ちなみに複数のアニメーションの切り替えをなめらかにする（ブレンドする）には、`AnimationTree` という仕組みを使うと実現できるようです（※未検証）

# プロジェクトファイル
右腕のIKしか入れていないですが、今回の内容のプロジェクトファイルは以下からダウンロードできます
http://syun777.sakura.ne.jp/tmp/godot/TestCutOut.zip

# 参考

* [Godot Docs » アニメーション » カットアウトアニメーション](https://docs.godotengine.org/ja/stable/tutorials/animation/cutout_animation.html#doc-cutout-animation)