今回は文字やスクリプト、データベース、外部との通信などを扱う DAT と それらを使う上で必要になってくる Python の勉強をしていきます!
サンプルファイル
chimanaco/takara-univ-media-programming-2021
08が本日のディレクトリです。
最終課題について
突然ですが、この講義の最終課題についてです。先週勉強した音のデータを可視化する方法を使って、音に反応して変化する作品を TouchDesigner で制作してください。この後実習が多いのと終盤講義に参加できない方がけっこうおられるとのことなので、早めにお知らせしています。「こういうの作りたいんだけどどうすればいいの?」など質問等ありましたらお気軽にいつでもどうぞ!
Python について
Python はとても広く使われている言語で、行列計算や統計処理などの数学的処理に使えるモジュールが豊富なため、近年では AI 開発に使用されることが多くなっています。読みやすく書きやすいプログラミング言語として設計されたため、プログラミング初心者にもおすすめです。
また、Maya, Blender, Houdiniなどの DCC(Digital Content Creation)ツールのスクリプト言語として使われています。TouchDesigner だけでなく、他のツールにも応用していけるのでこの機会に是非はじめてみてください!
TouchDesigner で Python を使う
Textport を使う
alt
+ T
で Textport のウィンドウを表示することができます。
python >>>
の後に print('Hello')
とタイプして Enter
を押すと Hello
という文字が表示されます。
これは print
という文字列を出力する関数に Hello
という文字列を入れて表示したものです。関数というのは、何かを入れると何かが行われて何かが出てくる仕組み、と考えられます。
Text DAT を使う /project1/TextDAT
TouchDesigner を使っていて、実際に Textport で Python を実行することは少ないと思いますので、今度は別の方法としてText DAT
を使用して Python のコードを実行してみましょう。
Text DAT
をネットワークエディタに配置して、右下の+
ボタンをクリックします。これでテキストを入力できる状態になります。
print('Hello')
とタイプして、Run Script
を実行すると、Textport に実行結果が表示されます。
このように Textport は Python の実行結果を確認する時によく使います。
まずは一般的な Python の文法をいくつかご紹介します。
数値演算 /project1/Arithmetic_operations
以下のような数値演算子が使えます。
Operator | Function | Examples | Result |
---|---|---|---|
+ | 加算 | 2 + 10 | 12 |
- | 減算 | 2 - 10 | 8 |
* | 乗算 | 2 * 10 | 20 |
/ | 除算 | 2 / 10 | 0.2 |
% | 剰余 | 2 % 10 | 2 |
** | べき乗 | 2 ** 10 | 1024 |
変数 /project1/Variable
変数とは値を格納する箱のようなものです。 格納したものを後で使用することができます。
a = 10 + 2
print(a)
# output: 12
型
プログラミング言語によっては、変数を宣言する際に、型宣言(この変数にはこの型を格納するという宣言)を行う必要がある言語があります。 Python でよく使われる型には以下のものがあります。
Type | Function | Examples |
---|---|---|
int | 整数 | 2, 10 |
float | 小数点 | 0.2, 10.5 |
str | 文字列 | “takara”, “宝塚” |
bool | 真偽 | True, False |
list | リスト | [1, 2, 3, 4], [ “takara”, “宝塚” ] |
Python の変数には型宣言が必要ないため、変数にどのような型でも入れることができるのですが、 型に注意しないと計算結果が意図しないものになることがあります。 例えば、以下のように整数と文字列では似ているものでも出力結果が異なります。
print(1 + 1)
# output: 2
print("1" + "1")
# output: 11
このように Python では + 演算子を使うことで複数の文字列を連結して 1つの文字列にすることができますが、文字列に数値を連結することはできません。 例えば、文字列(str)に整数(int)を足して表示しようとするとエラーになります。
c = 1
print("Index" + c)
# output: Error
解決法としては型変換をよく使います。以下は整数を文字列に変換する例です。
c = 1
print("Index" + str(c))
# output: Index1
比較演算子
Operation | Examples | Meaning |
---|---|---|
< | x < y | x が y より小さい |
<= | x <= y | x が y 以下 |
> | x > y | x が y より大きい |
>= | x >= y | x が y 以上 |
== | x == y | x と y が等しい |
!= | x != y | x と y が異なる |
これらは値の比較をするもので、条件分岐と合わせて使用されることが多いです。
c = 2
if( c < 10 ):
print("C is bigger than 10")
else:
print("C is smaller than 10)"
:
に続く行はインデント(字下げ)を行う必要があります。 1つのブロックでインデントが同じになっていないとエラーになってしまいますので注意しましょう。 例えば、以下はエラーになります。
if( c < 10 ):
print("C is bigger than 10")
IndentationError: expected an indented block
のようにエラー文の中に indent
という文字列があったら該当する行のインデントをチェックしましょう。
モジュール
Python には様々な機能をもった関数が簡単に使えるように用意されています。これらは使いやすいように目的や種類ごとに分類して提供されていて、こういった Python が機能を分類する単位をモジュールといいます。
例えば、多くの数学関連の機能は math
というモジュールに分類されています。モジュールに入った関数を利用する際には、そのモジュールをimport
文で指定します。
import math
# PI
print(math.pi)
# floor
print(math.floor(5.2))
# ceil
print(math.ceil(5.2)))
以下は random な値を生成するモジュールです。
import random
# Generate random value
print(random.random())
簡単に一般的に Python でよく使われるものをご紹介しました。 他にもまだまだ沢山の文法がありますので是非勉強してみてください!
ここからは TouchDesigner 独自の使われ方を勉強していきます。
よく使う Expression
Textport、Text DAT とともに、 オペレーターのパラメーターで expression として使うこともよくりあります。パラメーターの青い部分をクリックすることで明示的に使用できます。
時間
## ファイルを開いてからのフレーム数
absTime.frame
## ファイルを開いてからの秒数
absTime.seconds
Operator を参照する /project1/Operators
operator オブジェクトを参照する時は op('name')
を使用します。
自分自身を参照する場合は me
を使用します。
また、ひとつ上の階層を参照する場合は parent()
を使用します。
Operator のメンバー変数を参照する
メンバー変数という各オペレーターが共通で持っている変数を表示してみます。Operatorの後に .
を入れてその後に変数名を入れていきます。
# name
op('circle1').name
# output: circle1
# type
op('circle1').type
# output: circle
# digits
op('circle1').digits
# output: 1
Operator の parameters を参照する /project1/Operator_parameters
par
を使用してオペレーターのパラメーターを参照することができます。パラメーター名は parameter window で確認することができます。
# parameters
print(op('circle1').par.radiusx)
print(op('circle1').par.fillcolorr)
print(op('circle1').par.radiusx)
CHOP Execute
イベントが起こった時に反応する機能をCallbacksといいます。例えば CHOP Execute
は指定した CHOP に変化が起こった時に呼び出される DAT です。
Definition | Meaning |
---|---|
onOffToOn | Off から On になった時 |
whileOn | On になっている間ずっと |
onOnToOff | On から Off になった時 |
whileOff | Off になっている間ずっと |
onValueChange | 値が変わった時 |
Button COMP
とその直後に Null CHOP
を配置し、CHOP Execute
を追加します。Button COMP
の Button Type
は Toggle Down
にしておいてください。 CHOP Execute
デフォルトだと onValueChange
がオンになっています。以下のコードを書いて、ボタンをクリックしてみましょう。
def onValueChange(channel, sampleIndex, val, prev):
print('change!')
return
Value Change を Off にして、Off to On を On にします。
def onOffToOn(channel, sampleIndex, val, prev):
print('change!')
return
こうすることで 0 から 1に数値が変化した時に print が呼ばれます。
CHOP Execute + Text DAT /project1/CHOP_execute
Value Change を Off にして、Off to On を On にします。
def onOffToOn(channel, sampleIndex, val, prev):
op('text9').text = "ON"
return
On to Off を On にします。
def onOnToOff(channel, sampleIndex, val, prev):
op('text9').text = "OFF"
return
本日の課題: Button と Python を使って切り替えを行う
今日勉強した Python を使って、Button を押したら何か変化が起こるものを作ってください。数値でもテキストでも色でもサイズでも何でも構いません。 プロジェクトフォルダごと Teams に提出してください。
課題のサンプル: /project1/Example
講師が作成した課題のサンプルです。