見出し画像

Godot モデル動的構築 自分の事例4

前回の続き

キャラクターを表示するノード、Dollの説明です。
下図の中央の箱~!

Dollの位置づけ

Dollの構成

非DollのMiniatureは、複数のBoughを子ノードとして持つか、既存の単体Boughに直接アタッチして使っていました。

# Miniatureのノード構成

# 複数
Miniature
  Node3D or MeshInst3D (BoughAのルート)
    BoughAの子孫
  Node3D or MeshInst3D (BoughBのルート)
    BoughBの子孫
  Node3D or MeshInst3D (BoughCのルート)
    BoughCの子孫

# 直接アタッチ
Node3D or MeshInst3D (Boughのルート) ← Miniatureアタッチ
  Boughの子孫

Dollの場合、ノードの構成が次のようになります。

# Dollのノード構成

Doll
  Node3D(アーマチュアのルート)
    Skeleton3D
      MeshInstance3D (BoughA)
      MeshInstance3D (BoughB)
      MeshInstance3D (BoughC)
  AnimationPlayer

このような構成になるのは、もう完璧にアニメーションの都合です。AnimationPlayerはSkeleton3D下にあるMeshInstance3Dを動かすものだからです。

Boughが子を持たず単体で、必ずMeshInstance3Dなのは、そういうものです。キャラクターはBlenderの時点でそうなってるはずです。

Blenderの時点で単体メッシュオブジェクトの集合

Dollの組み立て

1つのアーマチュアと、複数の単体ノードBoughを、Workshopシングルトンから取得して組み立てます。
アーマチュアはDoll作成時にかならず1個存在します。BoughはDoll作成後に、追加したり削除したりします。このとき、別に同一のblendファイル由来のBoughでなくてもOKです。逆に、同一のblendであっても、含めないBoughがあって構いません。

2つのblendからDollが作られる例

基本ボディ、着替えボディ、アニメーションで、blendが3つに分かれてるとか。逆に、1つのblendに同一骨格の別クリーチャーが2つ入ってるとか。こういうの許容したい。でもGUIでセットアップとかしなくて済むようにしたい。このためのMiniatureシステムなんです。

AnimationPlayer

Dollは子としてAnimationPlayerノードを持ってます。
前記事で書いた通り、DollはAnimationPlayerの存在は管理していますが、その制御は放棄しています。AnimationPlayer参照を_get_anim_player_ref()関数で提供しているので、いい感じに使ってね、という思想です。

Doll作成時には、このPlayerが使うAnimationLibraryを最低1つセットします。これは普通にWorkshopシングルトンから取得します。

AnimationLibraryは追加で複数セットすることもできます。これはDollの機能というより、AnimationPlayerのそもそもの機能です。
アニメが多すぎて複数ファイルに分けてるとか、ムービーシーン用のワンショット使用のアニメは別ファイルにしてあるとか、そういう用途での使用が想定されます。

AnimationLibraryの指定方法は、blendのファイルパスです。1ファイルからインポートされるライブラリが1個だけなので、これで十分なのです。

また、細かい話ですが、AnimationPlayerのプロパティ、current_animation_positionとcurrent_animation_lengthは、current_animationの状態を確認せずにアクセスするとエラーとなるので、そこのラッパは提供してます。

func _try_get_current_anim_pos() -> float:
	if _anim_player.current_animation == "":
		return -1.0
	return _anim_player.current_animation_position

func _try_get_current_anim_length() -> float:
	if _anim_player.current_animation == "":
		return -1.0
	return _anim_player.current_animation_length

ボーンアクセス

Dollは、Skeleton3D空間での、ボーンの位置や向きの取得を提供します。これは主にVFXでの使用を想定してます。
・手から炎をエミットさせる
・寒さで吐く息が白い
・足跡を残す、とか

口から咆哮の衝撃波を発生(前作の例)

また、ボーンに対するNode3Dのアタッチ・デタッチを提供します。実装としては、Godot組み込みのBoneAttachment3Dノードを使ってます。ほぼそれのラッパです。

用途としては装備品の表現です。
・手に武器を持たせる
・ヘルメットをかぶせる
・剣や盾を背負わせる、など

もしくは、身体にくっつける、時間で消えないタイプのVFXです。
・目が光ってる
・腕にオーラをまとう
・身体の定点から炎をエミットさせる、とか

つづく


この記事が気に入ったらサポートをしてみませんか?