Blender から書き出した GLB に、目的の歩きとは別の action まで入っていました。画像から生成した人物 2 体(自然な頭身とデフォルメ)を同じ作りの骨格で歩かせ、GLB に書き出せるかを技術検証したときのことで、混ざったのはデフォルメのほうでした。描画した動画を見るだけではファイルの中身は分からないので、その GLB を読み込み直して、中にいくつ入っているかを確かめることにしました。

結論

  • 同じ骨格と互換のある action がほかにもあるシーンから書き出したら、デフォルメの GLB に別の action まで入りました。
  • 書き出しを、active な action だけに変えました。
  • 書き出した GLB を読み込み直し、どちらも skin が 1 つ、animation が 1 つ、関節が 16 であることを確かめました。あわせて、動かした頂点の値がすべて有限か、足の裏が地面の高さにあるかも見ました。

試した環境

  • 人物: TencentARC/Pixal3D で、服や鞄まで一体として生成した 2 体。生成した元のメッシュには手を入れていません
  • 人物を生成した計算機: Radeon RX 7900 XT(VRAM 20 GB)
  • 骨格: 16 関節。頂点の座標から連続的に決めたウェイトを正規化し、1 頂点の影響は最大 4。元のトポロジーとテクスチャのまま
  • 動き: 脚は 2 本の骨の IK を解析的に解き、体を支える足は世界座標で止め、振り出す足には弧を描かせました。腕は脚と逆に振り、肘を少し曲げます。24 fps で 4 秒、1 周期は自然な頭身が 32 コマ、デフォルメが 24 コマです
  • 書き出す物: その場で歩くループ。2 体を並べて比べる場面では、2 体とも高さ 2.3 で表示しました(同じ身長という意味ではありません)。前へ進む動き(毎秒 0.5)と追いかけるカメラは、その場面の側だけに足しています
  • 書き出しと確かめ: Blender

デフォルメの GLB に、別の action が入った

2 体は、同じ 16 関節の作りの骨格を使っていました。最初に書き出したとき、デフォルメの GLB に、その骨格と互換のある別の action まで入っていました。

1 つのファイルには、その人物の歩きのループを 1 本だけ入れるつもりでした。余計な animation が入っていると、受け取った側は、ファイルを開いて確かめないとどれが目的の動きか分かりません。描画した動画には、ファイルに animation がいくつ入っているかは映りません。歩きの動画が正しく見えていても、この混入には気づけません。

足跡の輪が二つ入った箱から、要らない一つを取り出して一つだけ残している絵

active な action だけを書き出す

書き出しを、active な action だけに変えました。使った Blender の版と、書き出しの設定項目の名前は控えていません。お使いの版の glTF の書き出しで、アニメーションを active な action に限る設定を探してください。これで、それぞれの GLB には、書き出すときに active にしていた歩きのループだけが入ります。

次の図は、最初の書き出しで混ざった action を、active だけの書き出しに変えて読み込み直すまでの流れです。

最初の書き出しから読み込み直すまでの流れ

読み込み直して確かめたこと

書き出した GLB を読み込み直したときの値です。1 コマ目と 9 コマ目の高さは、そのコマで最も低い頂点の高さです。

確かめたこと自然な頭身デフォルメ
skin の数11
関節の数1616
animation の数11
animation の名前natural_Walk_Loopchibi_Walk_Loop
読み込み直しでの姿勢の差の最大0.2860.256
動かした頂点の値すべて有限すべて有限
1 コマ目の最も低い高さ−7.9×10⁻⁸−6.9×10⁻⁷
9 コマ目の最も低い高さ4.0×10⁻⁷−3.0×10⁻⁷

どのコマの値もほぼ 0 で、足の裏は地面の高さにあります。

数のほかに、描画でも確かめています。2 体とも正面と横から、1 コマ目と 9 コマ目を描きました。2 体を並べた場面では、最初のコマで 2 体とも画面に収まり、足と手が見えていることを見ました。

確かめていないこと

  • 別の action が入った条件(Blender の版や、書き出しのほかの設定)は切り分けていません。
  • 読み込み直した後の姿勢の差(0.286 と 0.256)が何による差かは、確かめていません。
  • エンジンに読み込んで動かすところは、確かめていません。
  • 元の高密度のメッシュは軽くしていません。どちらも三角形が 90 万を超えたままで、書き出した GLB は自然な頭身が 56,542,400 バイト、デフォルメが 54,441,012 バイトでした。
  • 骨格は手続きで作った試作の物で、肩・腰・膝の変形には、まだ局所のウェイト調整が要ることがあります。布や髪の揺れのシミュレーションも入れていません。

おわりに

この検証では、骨格の作りが同じ 2 体を書き出すときに、active な action だけを書き出し、読み込み直して skin と animation の数を数えるところまでを、書き出しの一部として行いました。

※ Blender の glTF の書き出しと Pixal3D の振る舞いは執筆時点の情報です。いまは変わっている可能性があります。