8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TouchDesignerAdvent Calendar 2022

Day 14

Animation COMP w/o Animation Editor

Last updated at Posted at 2022-12-14

はじめに

この記事ではAnimation Editorを使用せずにAnimation COMPのアニメーションを作成する方法について紹介します。Animation COMPの基本的な使い方についてはこちらが参考になります。

Animation COMPの仕組み

Animation COMPの中を見ると次のようなTable DATが用意されています。
Animation COMP

Animation Editorからアニメーションを作成すると、”channels” と “keys” というTable DATに値が追加されていることがわかります。
Animation Editorからアニメーションを作成する

もう少し細かく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で使用するパラメータ:表示中(編集不可)

channels

keys

項目 説明
id 識別子
x キーフレームの位置
y キーフレームの値
inslope 接線のパラメーター(左)
inaccel
expression イージング関数
outslope 接線のパラメーター(右)
outaccel

keys

以上、この2つのテーブルのお作法に則りながらTable DATを作成してみます。

例)時系列データ(.csv)をAnimation COMPで再生する

センサー等で計測したデータを受信してビジュアライズするようなプロジェクトにおいて、事前に計測したデータ(.csv)を元にAnimation COMPで値を再生できるようなシミュレーターを作ってみます。(ここからは細かい設定や実装についてはかなり省略しているため「こんな風にできるんだぁ」程度に流し見してください:bow:

1. データを準備する

例)感情分析ソフト(仮)の計測結果.csv
感情分析結果.csv

channels

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

すると...

channels

keys

  • Timestamp (frame) を元に各キーフレームの位置を決定し、チャンネルごとに値を設定する
  • センサー値は補間しないので expression は constant()

keys

set_keyframe.py
# 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()')

実行すると...
keys

Animation Editor上でも確認することができます。
出力結果

2. データを再生する

データを再生する

最後に

今回はcsv形式のデータをAnimation COMPで扱えるようにTable DATを変換しただけですが、他にもkeysのTable DATを工夫することで、入力された値に応じてアニメーションの尺を変えたり、条件に応じてアニメーションを分岐するといったことも可能になりそうです。

追記

csvのデータの数が増えると負荷がかかるためTimestamp以外のデータをCHOPに変換し、TimestampからインデックスのみをAnimation COMPで作成するなど対策が必要そうでした。

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?