仕様はこちら
glTF 2.0 でアニメーションできるのは
- tranlate
- rotate
- scale
- weight
のプロパティ(path)のみ. また, 変化させることができるのは node の transform(translate, rotate, scale) と, morph target の weight のみ
たとえばマテリアルのパラメータを変化させることはできない.
animations
アニメーション(clip)の配列. たとえば ["run", "walk"] のような感じで animation clip を保持する.
animation は以下の変形させる channels の情報と, キーフレーム補間のための samplers の情報を持つ
Animation sampler
input のアクセッサでキーフレームの時刻リストのありかを指定する(input
という名称がわかりずらい...)
input accessor には min/max プロパティが入っている(キーフレームの区間)
また, アニメーションの単位は 秒
input : キーフレーム情報を持つ Accessor のインデックス. Accessor は min/max(キーフレームアニメーションの区間)を持たなければならない.
interpolation : 補間の形式(LINEAR, STEP, ...)
output : 各キーフレームに対応するアニメーションデータ(e.g. 回転 [10 度, 20 度, 30 度, ...])
たとえば AnimatedTriangle サンプルでは
min, max = [0.0, 1.0]
input count = 5
input = 0.0, 0.25, 0.5, 0.75, 1.0
(5 個のキーフレームで, 等間隔のキーフレーム)
output = rotation(VEC4) x 5
となっています.
Morph animation
output
が morph weights の場合(後述の animation channel で接続関係がわかる)は, output の個数は input_count * weights の個数になります.
Sparse accessor
morph target などは sparse accessor でメモリ効率よくしてくださいと仕様にあるが, どれくらい使われているか(glTF ビューアでサポートされているか)は不明.
Animation channel
実際にアニメーションさせる node とそのプロパティ(path. e.g. translate, rotation, scale)を指定する.
sampler : 前述の, キーフレームアニメーションのための sampler.
target.node : アニメーション対象の node
target.path : アニメーションさせるプロパティ
アニメーション値の復元
float ではない形式(8bit, 16bit データ)の場合は, 復元する式がきまっています.
アニメーションの再生
時刻 t
が与えられたときに,
for each channels:
channel.sampler.accessor.min/max が min < `t` < max のときに
channel.sampler.input のキーフレーム情報を参照し,
時刻 `t` に対するキーフレームと補間値を算出する
channel.sampler.output からキーフレーム値を取得し補間し,
それぞれの channels の target.path で指定したアトリビュートを変化
Skinning(bone animation)
glTF 2.0 では, Skinning(bone)をサポートしているが, skinning ではボーンの構造を記述するのみである. ボーンをアニメーション変化させるには, animation を使ってまずは各ノードの行列を変化させたのち, ボーン階層を評価して最終的な頂点位置を求める.
morph target との組み合わせ
T.B.W.
glTF 2.0 animation 仕様のここがよくない
アニメーションデータは Buffer から Accessor 経由で取得しないといけないため, bin or DataURI でエンコードされているため, テキスト形式でアニメーション情報を確認したり調整したりができない.