godot

L004 3dモデル


Godot4.xでの3dモデルについて記載しています。

モデル

物体が床に落ちるモデルです。

StaticBody3D(Floor)にCollisionShape3DとMeshInstance3Dを用いて床面を作成します。

CollisionShape3D
MeshInstance3D

位置を修正してコリジョン形状の上面と一致させています。

Ball

RigidBody3D(Floor)にCollisionShape3DとMeshInstance3Dを用いてボールを作成します。

位置を上の方へずらします。(重力方向がYマイナスなので、Yプラス側へ)

接触体の設定

ライト

位置と方向を調整します。

カメラ

カメラの切り替え

形状の読み込み

FreeCAD → Belnder → Godotの順でモデルを読んでいきます。
モデルはFreeCADで作成しています。

obj形式でモデルをエクスポートします。
続いてblenderでobjファイルを読み込みます。

単位はmで読まれます。

blenderからgblファイルを書き出します。

サンプルファイル: blenserBam.glb

glbファイルをgodotに読み込みます。

アニメーション付きモデル

blenderで作成したglbモデルを読み込んだ場合です。簡単なアニメーションが付いているモデルです。
カメラとライトを設置して、スクリプトでアニメーション実行させています。

extends Node3D
@onready var anim_player: AnimationPlayer = $AnimationPlayer
func _ready():
	# 初期化処理(必要に応じて)
	pass
func _process(delta):
	if Input.is_action_just_pressed("ui_accept"):
		anim_player.play("アクション")  # "jump" は再生したいアニメーション名に変更

以下、マウスでフォーカスして、スペースでアームが開きます。(web出力)

アニメーショントラック

blenderで作成したアニメーションとgodotでインポートした場合の内容を確認してみます。
blenderでどのように作っておけばいいか、の判断のためです。

blenderのモデル

アーマチュアのボーン.001と002にアニメーションが設定されています。

godot4.xへのインポート

Skeleton3Dにボーンの情報があります。また、AnimationPlayerでアニメーションのトラックが確認できます。

blenderでは80フレームでアニメーションを作成していましたが、インポートすると100フレームになっています。現状だと出力時の設定で見当たらないので、godot側のタイムスケールで調整することになりそうです。

トラックの名称ですが、blenderのコレクションで名称変更するとgodotへ持っていった場合も反映されます。チャンネルの名称を変えても反映されません。(blender 4.5.1 LTS ,Godot4.5 rc1)

接触設定

簡単な確認

簡単なモデルでblenderからgodotへの処理を検討します。

glbモデル:L004_box.glb

要点
・六面体と平板を対象としていますが、メッシュから接触形状を作成しています。
・コリジョンシェイプを作成する場合に、Collision Shape Placementとして、
兄弟または、スタティックボディの子を選択します。
・スタティックボディの子は、床や壁のような動かない要素を対象とします。
・今回は、六面体の方を動かすため、こちらを兄弟というメッシュ作成を実行します。実行すると、同じレベルに接触用のメッシュが作成されるのですが、こちらも結局はスタティックなものを対象としたメッシュということになるようです。
・今知りたいのは、動かせて、干渉できるメッシュ要素ですが、これは、godotでプリミティブなメッシュを追加して作成する必要があります。blenderでも入力規則によって読み込みの際、自動で設定できるようですが、それでもプリミティブな形に制限されるとのことです。

現状だと、動的な接触する要素は簡単な形を想定して、追加作成することになりそうです。

ボーンに接触体を付ける

ボーンに接触体をつけて相互作用できるようにします。
ボーンに接触体をつけるには、BoneAttachment3Dを付けて連携させます。
BoneAttachment3Dは、Skeleton3Dの特定のボーンに追従するように設計されており、その子ノードも一緒に動かすことができます。
 ここでは、CharacterBody3Dを付けます。確認だけですので、簡単にCollisionShape3Dも付けます。
mainのシーンを設けて、ボールを落としてはじくことを確認しました。

物理的な振る舞いをさせるには、**CollisionObject3D**から継承される以下のノードのいずれかを親として配置する必要があります。

  • StaticBody3D: 動かないオブジェクト(床、壁、地形など)。他の物理オブジェクトとの衝突を検出しますが、物理演算の影響を受けて動きません。
  • RigidBody3D: 物理演算の影響を受けるオブジェクト(ボール、箱、コインなど)。重力や衝突の力によって動きます。
  • CharacterBody3D: プレイヤーキャラクターやNPCなど、主にコードで制御されるオブジェクト。物理演算の影響を受けすぎないように、より細かい制御が可能です。
  • Area3D: 接触を検出するだけで、物理的な衝突は起こしません。トリガーや、プレイヤーが特定の場所にいるかどうかを判定するために使用されます。

ジグルボーン

「ジグルボーン」(Jiggle Bone)は、主に3Dゲームやアニメーションの分野で使用される、キャラクターモデルに二次的な動的な動きを自動で追加するための技術です。

一般的な特徴

  • 動的な二次アニメーションの自動生成:
    • キャラクターが動いた際(歩く、走る、ジャンプする、急停止するなど)に、アニメーターが手動でキーフレームを設定しなくても、物理法則に基づいた揺れをボーンに自動で発生させます。
    • これにより、髪の毛、尻尾、マント、服のひらひら、アクセサリー、体の一部(胸など)といった「揺れ物」に対して、リアルで自然な動きや、コミカルで誇張された動き(バウンドやゆらめき)を簡単に実現できます。
  • 物理効果の利用:
    • ジグルボーンは、通常、慣性、空気抵抗(減衰)、剛性(バネの力)、重力といった要素をシミュレーションして、ボーンの位置や回転を毎フレーム計算します。
    • 親のボーン(例:キャラクターの胴体)がアニメーションによって動くと、その子であるジグルボーン(例:髪の毛の先端)が動きに遅れて反応し、バネのように振動し、やがて元の位置に戻ろうとします。
  • 設定可能なパラメータ:
    • ゲームエンジンやツールによって名称は異なりますが、ジグルボーンには通常、以下のようなパラメータが用意されています。
      • 剛性 (Stiffness / K-Value): 揺れが元の形に戻ろうとする強さ(バネの硬さ)。値が大きいほど素早く止まります。
      • 減衰 (Damping / Air Drag): 揺れが時間とともに収まる速さ(空気抵抗)。値が大きいほどすぐに揺れが止まります。
      • 質量 (Mass): 揺れる部分の重さ。値が大きいほど動きが鈍く重くなります。
      • 重力 (Gravity): 重力の影響を受けるかどうか。
  • 用途:
    • ゲームのリアリティ魅力を向上させるために広く使われています。
    • 特に、動きの速いアクションゲームや、キャラクターの個性を際立たせたい場合に効果的です。

要するに、ジグルボーンは「アニメーションの主要な動き(手付け)に、物理演算による細かい二次的な揺れ(自動計算)を加える」ための仕組みです。

4.4以降の方法

アームにボーンを細かくして関連付けします。簡単なアニメーションも追加します。(blender)

glbファイルをエクスポートして、godotへ読み込みます。(ドラッグアンドドロップ)

アニメーションにメソッド追加

途中

コメント