Godot モデル動的構築 自分の事例4
前回の続き
キャラクターを表示するノード、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の時点でそうなってるはずです。
Dollの組み立て
1つのアーマチュアと、複数の単体ノードBoughを、Workshopシングルトンから取得して組み立てます。
アーマチュアはDoll作成時にかならず1個存在します。BoughはDoll作成後に、追加したり削除したりします。このとき、別に同一のblendファイル由来のBoughでなくてもOKです。逆に、同一のblendであっても、含めないBoughがあって構いません。
基本ボディ、着替えボディ、アニメーションで、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です。
・目が光ってる
・腕にオーラをまとう
・身体の定点から炎をエミットさせる、とか
つづく
この記事が気に入ったらサポートをしてみませんか?