はじめに
この記事ではAnimation Editorを使用せずにAnimation COMPのアニメーションを作成する方法について紹介します。Animation COMPの基本的な使い方についてはこちらが参考になります。
Animation COMPの仕組み
Animation COMPの中を見ると次のようなTable DATが用意されています。
Animation Editorからアニメーションを作成すると、”channels” と “keys” というTable DATに値が追加されていることがわかります。
もう少し細かくchannels と keys の中身を見てみます。
channels
項目 | 説明 |
---|---|
name | チャンネル名 |
id | 識別子 |
left | Extend Left |
right | Extend Right |
default | Default Value |
keys | 参照先DAT |
liner | Animation Editorで使用するパラメータ:色(R) |
lineg | Animation Editorで使用するパラメータ:色(G) |
lineb | Animation Editorで使用するパラメータ:色(B) |
picked | Animation Editorで使用するパラメータ:選択中 |
display | Animation Editorで使用するパラメータ:表示中 |
template | Animation Editorで使用するパラメータ:表示中(編集不可) |
keys
項目 | 説明 |
---|---|
id | 識別子 |
x | キーフレームの位置 |
y | キーフレームの値 |
inslope | 接線のパラメーター(左) |
inaccel | |
expression | イージング関数 |
outslope | 接線のパラメーター(右) |
outaccel |
以上、この2つのテーブルのお作法に則りながらTable DATを作成してみます。
例)時系列データ(.csv)をAnimation COMPで再生する
センサー等で計測したデータを受信してビジュアライズするようなプロジェクトにおいて、事前に計測したデータ(.csv)を元にAnimation COMPで値を再生できるようなシミュレーターを作ってみます。(ここからは細かい設定や実装についてはかなり省略しているため「こんな風にできるんだぁ」程度に流し見してください)
1. データを準備する
channels
以下のようにScript DATでパラメーターを設定します。
- Timestamp 以外のラベルを
name
として設定する -
id
はラベルごとに順番に採番する -
left
right
= hold -
default
= 0 -
keys
= keys -
liner
,lineg
,lineb
は好みで -
picked
,display
,template
= 0
# me - this DAT
# scriptOp - the OP which is cooking
#
# press 'Setup Parameters' in the OP to call this function to re-create the parameters.
import colorsys
def onSetupParameters(scriptOp):
return
# called whenever custom pulse parameter is pushed
def onPulse(par):
return
def onCook(scriptOp):
# ➁ Channelsのラベル
scriptOp.copy(scriptOp.inputs[0])
# ⓵ CSVのラベル
name = scriptOp.inputs[1]
for i in range(1,name.numCols):
color = colorsys.hsv_to_rgb(i / name.numCols, 1, 1)
# ⓷ パラメーターを追加する(例:happiness, 1, hold, hold, 0, keys, 1.0, 0.857142, 0.0, 0, 0, 0)
scriptOp.appendRow([name[0,i], i, 'hold', 'hold', 0, 'keys', color[0], color[1], color[2], 0, 0, 0])
return
すると...
keys
- Timestamp (frame) を元に各キーフレームの位置を決定し、チャンネルごとに値を設定する
- センサー値は補間しないので
expression
は constant()
# keysをリセットします
keys = op('keys')
keys.par.dims = True
keys.par.dims = False
# animation COMP
animOp = me.parent()
# csvのデータ
dataOp = op('data')
# 計測の開始を先頭データに合わせるためのオフセット値
time_offset = dataOp[1, 0]
for i in range(1, dataOp.numRows):
# キーフレームの位置
position = float(dataOp[i, 0]) - float(time_offset)
# 各ラベルごとにキーフレームを追加する
for j in range(1, dataOp.numCols):
channel = dataOp[0,j]
value = dataOp[i,j]
animOp.setKeyframe(position, channel=channel, value=value, function='constant()')
Animation Editor上でも確認することができます。
2. データを再生する
最後に
今回はcsv形式のデータをAnimation COMPで扱えるようにTable DATを変換しただけですが、他にもkeysのTable DATを工夫することで、入力された値に応じてアニメーションの尺を変えたり、条件に応じてアニメーションを分岐するといったことも可能になりそうです。
追記
csvのデータの数が増えると負荷がかかるためTimestamp以外のデータをCHOPに変換し、TimestampからインデックスのみをAnimation COMPで作成するなど対策が必要そうでした。