0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GodotIKを試した

Posted at

はじめに

 以前より、VRMやその他3Dオブジェクトの簡単便利なアニメーション作成ツールとして、VRMViewMeisterをUnityで作ってきた。
 以前のUnityのライセンス騒動をきっかけとしてGodot Engineに注目し、GodotでもVRMViewMeisterを再現できないかいろいろ調べて試してきた。

今回もそんな試行錯誤の一環として、新たに試したGodot Engine用のアドオンがある。
その名も・・・

GodotIK

である。

GodotIKとは?

GodotIKとは、Godot Engineで使えるIKシステムである。といっても名前からあふれる公式感で間違えやすいが、有志の作ったアドオンである。

Godotの標準のIK(とくに3D)はあるんだかないんだかよくわからず、あまり出来も良くなくまだ改良中の気配があるので、あまり使えそうにない。

自分はVRMをUnityのAnimator標準のIKのように自由に動かせればそれでいいのだが、Godot標準のIKでは満足いく実装ができそうになかった。
そこで調べていて発見したのが GodotIK だ。

GodotIKの導入

まずは公式リポジトリにアクセスする。
書いてあるとおりなのだが、多分パッと見ではプロジェクト導入時に混乱するので書いておこう。

1, 以下からダウンロードする。

2, 解凍すると次のようなフォルダ構成になっていることを確認する。

image.png

実際に自分のプロジェクトで使用するのは、addons 以下の libik フォルダそのものだけだ。

3, libik フォルダを自分のプロジェクトの addons フォルダにコピーする。

4, Godotのプロジェクトではこうなることを確認する。

image.png

ちなみにアドオンでよく見かける plugin.cfg plugin.gd は存在しない。
image.png

そのため、プロジェクト設定のアドオンの一覧には出てこないので注意。

image.png

GodotIKをVRMに設定する

VRMをシーンに追加して読み込んだら、編集可能な子 にチェックを入れてツリービューを展開できるようにする。
image.png

そうしたらVRMのルートノードにある Skeleton3D ノードを選択し 子ノードを追加 する。

image.png

前述の通りアドオンとして出てこないが、ノードの一覧にはしっかり出てくるので問題ない。
image.png

VRMに対して追加すべきは次のノードだ。

  • GodotIK
  • GodotIKEffector

最低限の使用としてはこれで十分だ。

1, まずは GodotIK をVRMの子ノードとして追加する。
2, GodotIKの子ノードとして今度は GodotIKEffector を追加する。

するとこのようになる。
image.png

別パターン

別のやり方として、 GodotIKRoot を使う方法もある。
GodotIKRoot は公式リポジトリだとこのように説明されている。

GodotIKRoot An alternative root node, under which effectors and constraints can be placed. Links into GodotIK through a Nodepath refernce.

通常だとGodotIK配下にしかエフェクターとコンストレイントを配置できないが、この GodotIKRoot を別のノードにおいておくと、そっちにもエフェクターとコンストレイントを配置できるようになる。

つまり、こういうことだ。
image.png

GodotIKRoot 側に、IK Controller なるプロパティがある。それに GodotIK を指定すると、リンクするようになるのだ。

これにより、GodotIKEffectorGodotIKConstraint 自体をVRMの子ノード(孫ノード)として置いておく必要がなくなる。ノードの取り回しが自由になるのだ。

GodotIKの設定

ノードを追加したら、プロパティを変更していく。

1, GodotIKEffectorに紐づけたいボーン名を選択する。
image.png

VRMの手や頭など動かしたい部位1つに付き GodotIKEffector 1個となる。

Bone Name - 動かす対象のボーン
Bone Idx - Bone Nameを選択すると自動的に選択される
Chain Length - 動かす部位によって、ボーンがいくつ連動するのか指定する。

Transform Modeについて

このTransform Modeが一番重要だ。これにより、IKの挙動が決まる。
実際にはこれにRemoteTransform3Dを紐づけたりして動かすかもしれないが、直接的にはこの Transform Mode のプロパティがすべてを決める。

説明だけだとわかりづらいので動画を用意した。

Property Description
Position Only 部位の回転自体はデフォルトのままで、移動だけ行う。角度自体がそのままなので移動させれば部位の回転が変わる。
Preserve Rotation 部位のデフォルトの回転を維持し、移動だけを行う。親のボーンの回転が維持されるので、手や足首を動かしたい場合に適している。動画参照。
Straighten Chain 部位の回転を維持し、移動だけを行う。Preserve Rotationと似ているが少々違う。動画参照。
Full Transform エフェクター側で回転するとちゃんと部位も回転する。移動と回転すべてを操作できる。

スクリプト中でいつでも変更できるので、このあたりは導入するアプリによって使い分けるのが良いだろう。

さらに踏み込んだ操作

例えばアプリ内でトランスフォームハンドルを使ってVRMを動かすような場合、エフェクターのままではなく、別に3Dオブジェクトを配置し、それに対して操作するとエフェクターも動くような仕組みが良いだろう。

例えば、CSGBox3D(基本的な図形)を配置し、それに RemoteTransform3D を子ノードとして追加する。RemoteTransform3DRemote Path プロパティに任意のエフェクターを紐づける。

image.png

そして RemoteTransform3D を子どもに持つ CSGBox3Dをトランスフォームハンドルのアドオンで動かすようにする。

すると GodotIKEffector を通じ、VRMの対象の部位が動くようになる。
図にするとこんな感じだ。

少々手順が必要な仕組みだが、VRMのノードに集約させるよりもあとで修正が効きやすいだろう。

RemoteTransform3D を使うことで、操作の末端たるこの部分でPositionやRotationなどを個別に操作オンオフできるので、より細かい取り回しがしやすくなる。

image.png

動かした結果

Godotの内臓のIK(SkeletonIK3D)だと苦労した、手を動かしたあとに肘を動かして手の角度を後から変更する。
といった、UnityのFinalIKやAnimatorのIKでは当たり前にできていたことが、ようやくGodotでも実現できるようになる。

image.png

あとは GodotIKEffector を親子関係にして動かす単位を工夫すればさらに違ったIKの挙動を実現できるだろう。

なお、GodotIKEffector を子どもに持つ GodotIKGodotIKRoot 自体を動かすと、すべてのエフェクターが同時に動く。
VRM自体は動かないので、VRM自体にも RemoteTransform3D を紐づけてあげてうごかせばさらに便利に操作できるかもしれない。

終わりに

今回は GodotIK を見てきた。
まだまだ開発中とのことらしいが、現状でも個人的な用途としては十二分に活用できると判断した。
素敵なアドオンを開発してくださってとても感謝している。
ぜひ皆さんの活用の参考になれば幸いである。

あと、ついでに宣伝。
もしGodot でトランスフォームハンドルをお探しの方がいれば、拙作のアドオンもぜひ試していただければと思う。

ハンドルの形状はクセが強いものがあるのでぜひ改良等自由に加工していただければと思う。

なお、今回テストで作ったプロジェクト一式のリポジトリは下記に置いたので参考にしていただければ幸いである。

※VRMやfbx等はすべて自作のものです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?