SubstanceDesignerでアニメーションを作る試みシリーズ。
再生するSubstancePlayerにタイムラインはあるけれど、作成するツールのSubstanceDesigner上にタイムラインはないわけでそこはもうノードパラメータで作っていくしかない。とはいえSubstanceDesignerでのアニメ作成にもとてつもない利点があるにで続ける。徐々に記事にしていく予定。
アニメーションカーブを使いたい
関数ノードにはイージング系のノードもたくさん用意されており、それを使いこなしてアニメづけしてももちろんいいのだが、外連味のあるタイミング指定などはやはりアニメーションカーブで指定したい。でもSubstanceDesignerにはアニメーションカーブノードはない。でもトーンカーブのノードはある。という事でトーンカーブを使ってアニメーションカーブを代替させてみた。
最終的な構成と書き出したアニメーションは以下。


基本の動作の仕組み
まず、横に長い画像でカーブノードを作る。出力サイズは絶対値に。512x16pxになっているが、縦ドット数は実は何でもいい。横ドットは複雑なカーブの場合大きいほうがいいかもしれない。動作は入力を足らないExposeモードにする。黒から白のグラデーションを持った画像が作られる。

これをトーンカーブで編集。0~1の値の変化がのちの処理でそのままアニメーションカーブとして使われるようになる。

この変化した値をバリュープロセッサーで吸い出す。吸い出したいx座標は外部から入力。

バリュープロセッサーの中はこんな感じ。ここで取り出した値は適当なノードに渡してアニメーションで利用できる、、と思ったがこのままだとだめだった。入力が0または1の時の値が不正となる。なぜか。
値の取得の調整
値がおかしくなる理由の1つはカーブ値の取得が実際は複数ピクセルからの色の取得であるため、誤差が出る事がある。もう1つは位置が1の値の取得は位置が0である場合と同じ扱いなってしまうから。
1に近い入力値は1にする

この処理は必須。まず横1ドットちょっとを表す範囲を判定に使うごく小さい値とした。1からこの値を引いた値より大きいの入力値はそこを最大値とした。つまり最大入力値が0.9999のような感じだ。
値の取得誤差をごまかす
実はカラー値の読み取りのメソッドをバイリニアにしていたのだが、これが良くも悪くも作用する。

入力グラデーション画像の横幅が小さい場合なだらかな変化の値がとれなくなってしまうので、バイリニアにする必要がある。しかし位置が0の場合に位置が1のドットの値と補完された値が取れてしまう。つまり純粋に0が返ってこない。
値の読み取りメソッドを二アレストにすると0の座標の値は正しく戻ってくるのだが、アニメーションがガクガクしてしまう可能性がある。という事でメソッドはバイリニアで行くことにする。
つまり入力値が0に近い場合はほんの少しだけ大きくするという処理を入れる。

これで動作するが、min / max ノードを使えばよかった気がしてきた。

定数の遊び幅や利用ノードをコメントと合わせて整理。完成か?
ワークアラウンド?
どっちみちカーブポイントを多く打つならカーブノードの横幅は必要なのだ。もしなにかこのノードでおかしな値が得られるようなことがあっても入力カーブノードの横幅を増やすと解決しそうだ。実際に横幅ドットを128などにすると、やはり位置0と位置1の値がおかしくなった。
仕上げ

バリュープロセッサノードを再利用できるようにとりあえず別グラフにしてみた。単独でsbsarに書き出すのはまたいずれ。この入力画像の大きさを絶対指定で1024×16とかにしたほうが安全かもしれない。(まだやってない。)

こんどこその最終。先日の投稿で解説した時間変数インプットの仕組みを使っている。

Substance Playerで再生している様子。やり方は以下参照。
ダウンロード
sbsとsbsarを配布しておく。いずれ自作便利ノードを集めて正式に配布したい。
配布sbsarファイルには、再利用可能なfake_anim_curveグラフと、そのテスト用(上のアニメが入っている)のfake_anim_curve_testグラフの2つが入っているので注意。







もしかしてテクスチャのリピート切るだけで解決したりしたかも?
いずれアップデートすることがあれば確認する。