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 の数 | 1 | 1 |
| 関節の数 | 16 | 16 |
| animation の数 | 1 | 1 |
| animation の名前 | natural_Walk_Loop | chibi_Walk_Loop |
| 読み込み直しでの姿勢の差の最大 | 0.286 | 0.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 の振る舞いは執筆時点の情報です。いまは変わっている可能性があります。


