CGデザイナーの川村(@tsumiki_room)です
[TouchDesigner] スプライトシートを使ったフリップブックアニメーションを作る【その1】の続きです。
よろしければ【その1】もあわせてお読みください。
サンプルシーンはこちらです : TouchDesigner_SpliteSheet
1.はじめに
- TouchDesignerのGeo COMPのTexture Coord OPを使ったスプライトシートアニメーションを簡単に作成する方法を解説します。
- コーディング不要です。
2.プロジェクトを開く
まずはサンプルシーンをダウンロードしてください。

①結果
②スプライトシート
③geoCOMP
④スプライトシートを動かすためのbaseCOMP「FlipBook_Texture」

①結果
これを作っていきます。

②スプライトシート
5×5の25フレームです。
作り方については【その1】をお読みください。

③geometryCOMP
スプライトシートを実現するためにInstance 2タブ内にあるTexture Coord OPを使います。

④FlipBook_Texture
GeoCOMPのTextureCoordに入力するためのBaseCOMPです。
3.FlipBook_Textureの解説
中身はこんな感じです。
- Paramater
- 親階層で入力したパラメーターです
タイリング数、1秒あたりのフレーム数、インスタンス数を指定しています
- 親階層で入力したパラメーターです
- UV Coord
- スプライトシートのUV座標を作成しています
- Animation
- スプライトシートのコマ送りをしています
- Initialize Frame
- 初期フレームを指定しています
- FlipBook Scale
- スプライトシートの1コマぶんの範囲を指定しています
- Merge
- UVの位置と範囲をひとつのTOPにまとめています
今回TOPを使っていますが視覚的な表現のためではなく、座標や大きさのために使います
そのためTOPのCommonタブ内のPixel Formatは32bit-float以上にします

3.1.Paramater
ここではフリップブックアニメーションのための基本的な数値を指定しています
- Texturecountx / Texturecounty
- スプライトシートXYのフレーム数
- Animationspeed
- フリップブックの速さ(1秒あたりのフレーム数)
- Particlecount
- インスタンス数

3.2.UV Coord
スプライトシートの領域をフレームごとに分けて指定したフレームを順番に取り出せるようにします

- XとYでそれぞれ指定したフレーム数を[0-1]のリニア画像にします

- [0-1]のリニア画像をリマップしてフレームの原点にくるようにします
- (me.width-1) / me.width で乗算することで、各フレームの左下の原点座標を指定します


- X/Yのリニア画像を組み合わせて各フレームの原点座標をもったTOPを作ります
- flipTOPで正しくスプライトシートの順番に並ぶようにします
- reoderTOPを使ってX座標はRed、Y座標はGreenで一枚のTOPにまとめます


こういう順番でフレームを指定したい

UV座標も同じように並ぶように調整する
3.3.Animation
各フレームが順番に動くアニメーションを作成します

- reoderTOPでタテヨコに並んだ画像をヨコ1列に並べなおします
- Palette(Alt + L) → Derivative → PointClouds → pointTepack をエディタにドラッグ&ドロップしてreorderTOPの後ろにつなぎます
- RepackingタブのResolutionに以下を入力します
Resolutionw : op(‘reorder1’).width * op(‘reorder1’).height
Resolutionh : 1 - TransformTOPに接続します

- 各フレームが(0,0)から(1,1)までループさせる仕組みを作ります
- SelectCHOPでparamaterで設定したAnimationspeedを取得します
- speedCHOPにつなぎます
接続した数=フレームレートなので30と入力した場合30fpsになります - mathCHOPで-1を乗算して符号を反転させます
- 結果を先ほど作ったtransformTOPのtxに代入します

各フレームが(0,0)から(1,1)までをループするTOPができました

3.4.Initialize Frame
- 各インスタンスの初期フレームを設定します
- patternCHOPのTypeをRampにします
- SelectCHOPでparamaterで設定したParticlecountを取得してpatternCHOPのLengthに代入します
- sortCHOPをつなげてSample Sort MethodをRandomにします
- CHOP to TOPをつなげてImage LayoutをFit to Squareにします

こんな感じに白から黒までの正方形のタイルができたらOKです

- 白黒のタイルと先ほど作ったTransformTOPのアニメーションをlookupTOPで接続します
タイルの色がTransformTOPのピクセルカラーに置き換わります

3.5.FlipBook Scale
- スプライトシートから各フレームがどのくらいの範囲を取り出すのかを指定します
- constantTOPの解像度をインスタンスの数に合わせます
- 1をスプライトシートのタテヨコのフレーム数で割ってフレーム一つあたりの範囲を指定します
colorr : 1/op(‘null1’)[‘Texturecountx’]
colorg : 1/op(‘null1’)[‘Texturecounty’]

3.6.Merge
- 座標とスケールをひとつのTOPにまとめます
- reorderTOPにそれぞれのTOPをつなげます
- 座標はRG、スケールはBAとして指定します

これでフリップブックアニメーションまわりは完成です!
あとはgeoCOMPにつなぐだけです
4.Geometry COMPへの渡し方
前述したとおり、Instance2タブのTexture Coord OPを使って数値を渡します
- デフォルトでTexture Coord OPはこのようにUVWを指定する方式になっていますが…

- Texture Mode : Transform
に変更すると、RotateやScaleも指定できるようになります

- FlipBook_Textureで作成したTOPを以下のように入れます

スプライトシートの画像はカラーテクスチャとしてconstantMATに入れてgeoCOMPに渡します

完成!

おつかれさまでした!
5.おわりに
フリップブックアニメーションはほとんどのゲームエンジンで簡単に使用することができ、移植性が高く、WebGLやモバイルデバイスのような限られた環境でも動作が軽快です。
ぜひTouchDesignerでもフリップブックアニメーションを活用してみてください!