『横空手 :yokoKarate』

2Dスケルタルアニメソフト 「Spine」 を触っていた所、 javaScript & WebGL で動作するランタイム があった。
サンプルも充実してて、これなら割と楽に実装まで行けるので、タップでいじれるアニメを作ってみた。

Spineでの試作と雑感 images/trials/quote00.jpg
(画像クリックで別窓で再生。再生しなければ、javascriptの有効化、ブラウザのWebGL対応などご確認ください。)

空手の基礎の「形」をモチーフにしたアニメ。画面上半分のタップで上半身、下半分のタップで下半身が動く。
突きや受け、蹴りが綺麗に決まると楽しい。適当に連打すると不審な挙動をしてくれて楽しい。
上半身と下半身、前と次などアニメとアニメの間はSpineがいい感じにブレンドしてくれてる。いい感じでないところもある。

縦長の画面だとちょっとプレイし辛い。

Spine雑感。

使用バージョンは 3.7.92、 3.8.11 beta あたり。

エディタ

  • アトラス書き出しの項目が充実していてよい。
  • 公式スタッフさんの twitter にhowtoが多くてよい。
  • 2Dスケルトンの制約に馴染めば色々出来そう。
    • 複数の原画(横と正面など)をきれいなボーンにまとめるのがとても大変。
    • 正面方向へ膝を曲げるなど2Dからはみ出ようとするとコツが要る。
  • 作業時にキーフレームに作ったポーズを、実行時に必ずしも表示しない。
    • 例えば10フレーム目にキーを打ったアニメも、実行環境によっては9.6フレーム目の次に10.5フレーム目みたいな半端なタイミングの中割りを表示するので、蹴上のインパクトなど一瞬の動作が潰れてしまう事がある。
  • エクスポートの設定により、エディタ内のプレビューと実際の挙動が異なる場合がある。(後述キーフレームの話参照)

ランタイム

  • API Reference もあるが、細かいところは見て覚えろ系。
    • サンプル とか、 コード直接 とか。
    • WebGL版にはReference にない “AnimationState.setAnimationWith()” が用意されてたりする。
  • パーツの表示順序(drawOrder)はアニメ中に差し替えられるが、「表示順序」でひとつのタイムラインを持つため、優先順の高いトラックの指定のみが有効になる。
    • 今回の場合、上半身(track0)と下半身(track1)で表示順序をいじっていると、上半身の分は反映されない。
    • なので揚げ受けや手刀受けで腕の重ね順がおかしい場合がある。
  • mixDurationは自トラック内のディゾルブ時間の設定。mixBlendは下位トラックとのブレンド設定。まぎらわしい。
  • TrackEntry.attachmentThreshold, draworderThreshold の効果がないように見えた。
  • など、不具合?もあるけどフォーラムが活発なので言えば改善してくれそう。

アニメのミックスにはキーフレームがとても重要

公式でも端々で言及されているが、トラック間のミックスや前と次のアニメのミックスには、キーフレームが打ってあるかがとてもとても重要となる。
アニメによってキーフレームを打ってたり打ってなかったりするボーンはミックス時に不具合が起こりがち。
経験上、 mixDuration > 0 で mixBlend == add だったりするとスケルトンが爆発する。

ところで、エクスポート設定に「アニメーションクリーンアップ」というものがある。動きに関係ない無駄キーフレームを自動で削除してくれる機能。
アニメ作成時、熱が入るとどうしても適当にたくさんキーフレームを打ってしまうのでとてもありがたい。
エディタ内にも各アニメーションに対してこれを行えるボタンがある。

で、これをすると上記の不具合が起こる。動いていない個所のキーが消えてしまうため。
クリーンアップをOFFにすると無駄データが残る。痛し痒し。

というのをバグだと信じて追っていたが、明確に仕様らしい。
ただ公式でも懸念はしており、クリーンアップにボーンのロックなどの 機能追加 を考えているらしい。

などなど、Spineは今後の開発ロードマップ を公開しているので、ざっと眺めると面白い。