
概要 📖 – 属性値を演算で変換
Math POPは、入力ジオメトリの属性値に対して加算・乗算・関数変換・範囲リマップなどの数学演算を一括で適用する POPです。ポイント・頂点・プリミティブの各属性クラスごとに、Pre/Post 演算・スケーリング・量子化・型キャストなど多彩な操作を 1 ノードで実現します。
主な用途 🎯
- ポイント位置 (P) の一括スケーリング・オフセット計算
- 色 (Cd) や法線 (N) などの属性値の正規化・範囲リマップ
- パーティクルの寿命・サイズ属性の数学的変換
- 角度単位の変換 (Degrees / Radians / Cycles) と三角関数の適用
- 出力属性のキャスト変換 (float / int / Color / Direction) とコンポーネント数調整
データフロー 🔄
入力: POP ジオメトリ(属性付き)
↓
属性スコープと演算設定に基づく数学処理
↓
出力: 同形状ジオメトリ(演算後の属性値)
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Math Page 📋
属性クラス .attrclass 🧱
演算対象とする属性の所属クラス (点・頂点・面) を指定
| 項目 | 内部名 | 説明 |
|---|---|---|
| Point | .point |
ポイント属性 (位置 P や色 Cd 等、頂点共有データ) を対象に演算 |
| Vertex | .vertex |
頂点属性 (Tex 等、プリミティブ別に持つデータ) を対象に演算 |
| Primitive | .primitive |
プリミティブ属性 (面単位で持つ法線や色 等) を対象に演算 |
グループとスコープ 🎯
Group .group 🗂️Group (グループ名) — 入力にグループがある場合、ここで名前を指定するとそのグループ内の要素のみを対象に演算します。空欄なら全体に適用。
Input Attribute Scope .inputattrscope 🔍Input Attribute Scope (入力属性スコープ) — 指定した属性クラスの中で、どの属性 (例 P や Cd) のどのコンポーネントを演算対象にするかをパターンで絞り込みます。
角度単位 .angleunit 📐
三角関数や角度関連パラメータの単位を選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| Degrees | .deg |
度単位 (0〜360 で 1 回転) |
| Radians | .rad |
ラジアン単位 (0〜2π で 1 回転) |
| Cycles | .cycle |
サイクル単位 (0〜1 で 1 回転) |
パラメータサイズ .parsize 🔢
Pre/Post Add・Multiply などのスカラパラメータを何成分まで独立に持つかを指定
| 項目 | 内部名 | 説明 |
|---|---|---|
| 1 | .1 |
1 成分 (スカラ値) で全コンポーネントに同じ値を適用 |
| 2 | .2 |
2 成分 (例 UV 座標) を独立に制御 |
| 3 | .3 |
3 成分 (XYZ / RGB 等) を独立に制御 |
| 4 | .4 |
4 成分 (XYZW / RGBA 等) を独立に制御 |
Pre 演算 .preoper ⚙️
add-multiply-add の前段で 1 つの数学関数を適用
| 項目 | 内部名 | 説明 |
|---|---|---|
| None | .none |
演算を適用しない (素通し) |
| abs(A) | .abs |
絶対値 |
| sign(A) | .sign |
符号 (-1 / 0 / 1) |
| sqrt(A) | .sqrt |
平方根 |
| A * A | .square |
2 乗 |
| 1 / A | .inverse |
逆数 |
| floor(A) | .floor |
切り捨て (床関数) |
| round(A) | .round |
四捨五入 |
| ceil(A) | .ceil |
切り上げ (天井関数) |
| int(A) | .int |
整数化 (小数切り捨て) |
| fract(A) | .fract |
小数部分のみ |
| degrees(A) | .degrees |
ラジアン → 度 変換 |
| radians(A) | .radians |
度 → ラジアン 変換 |
| normalize(A) | .normalize |
ベクトルを単位長に正規化 |
| exp10(A) | .exp10 |
10 の A 乗 |
| exp2(A) | .exp2 |
2 の A 乗 |
| exp(A) | .exp |
自然対数の底 e の A 乗 |
| log10(A) | .log10 |
常用対数 (底 10) |
| log2(A) | .log2 |
2 を底とする対数 |
| ln(A) | .ln |
自然対数 (底 e) |
| sin(A) | .sin |
正弦 (Angle Units 設定に従う) |
| cos(A) | .cos |
余弦 |
| tan(A) | .tan |
正接 |
| asin(A) | .asin |
逆正弦 |
| acos(A) | .acos |
逆余弦 |
| atan(A) | .atan |
逆正接 |
| dbtopow(A) | .dbtopow |
デシベル → パワー値 変換 |
| powtodb(A) | .powtodb |
パワー値 → デシベル 変換 |
| dbtoamp(A) | .dbtoamp |
デシベル → 振幅 変換 |
| amptodb(A) | .amptodb |
振幅 → デシベル 変換 |
| length(A) | .length |
ベクトル長 (ノルム) |
| compadd(A) | .compadd |
全成分の合計 |
| compsub(A) | .compsub |
全成分の差分 |
| compmult(A) | .compmult |
全成分の積 |
| compdiv(A) | .compdiv |
全成分の除算 |
| compavg(A) | .compavg |
全成分の平均 |
| compmin(A) | .compmin |
全成分の最小値 |
| compmax(A) | .compmax |
全成分の最大値 |
加算・乗算・後加算 ➕
add-multiply-add の本体。入力値に対して (A + preadd) * mult + postadd を適用
Pre Add .preadd ➕Pre Add (事前加算) — Multiply の前に入力値へ加算する値。負値を入れればオフセットの中心を移動できます。
Multiply .mult ✖️Multiply (倍率) — Pre Add 後の値に乗じる倍率。スケーリング・反転 (負値) ・ゲイン調整の中核。
Post Add .postadd ➕Post Add (事後加算) — Multiply 後の値にさらに加算する値。最終的なバイアス調整に使用。
Post 演算 .postoper 🛠️
add-multiply-add の後段で 1 つの数学関数を適用
| 項目 | 内部名 | 説明 |
|---|---|---|
| None | .none |
演算を適用しない (素通し) |
| abs(A) | .abs |
絶対値 |
| sign(A) | .sign |
符号 (-1 / 0 / 1) |
| sqrt(A) | .sqrt |
平方根 |
| A * A | .square |
2 乗 |
| 1 / A | .inverse |
逆数 |
| floor(A) | .floor |
切り捨て |
| round(A) | .round |
四捨五入 |
| ceil(A) | .ceil |
切り上げ |
| int(A) | .int |
整数化 |
| fract(A) | .fract |
小数部分のみ |
| degrees(A) | .degrees |
ラジアン → 度 変換 |
| radians(A) | .radians |
度 → ラジアン 変換 |
| normalize(A) | .normalize |
ベクトルを単位長に正規化 |
| exp10(A) | .exp10 |
10 の A 乗 |
| exp2(A) | .exp2 |
2 の A 乗 |
| exp(A) | .exp |
e の A 乗 |
| log10(A) | .log10 |
常用対数 |
| log2(A) | .log2 |
2 を底とする対数 |
| ln(A) | .ln |
自然対数 |
| sin(A) | .sin |
正弦 |
| cos(A) | .cos |
余弦 |
| tan(A) | .tan |
正接 |
| asin(A) | .asin |
逆正弦 |
| acos(A) | .acos |
逆余弦 |
| atan(A) | .atan |
逆正接 |
| dbtopow(A) | .dbtopow |
デシベル → パワー値 変換 |
| powtodb(A) | .powtodb |
パワー値 → デシベル 変換 |
| dbtoamp(A) | .dbtoamp |
デシベル → 振幅 変換 |
| amptodb(A) | .amptodb |
振幅 → デシベル 変換 |
| length(A) | .length |
ベクトル長 |
| compadd(A) | .compadd |
全成分の合計 |
| compsub(A) | .compsub |
全成分の差分 |
| compmult(A) | .compmult |
全成分の積 |
| compdiv(A) | .compdiv |
全成分の除算 |
| compavg(A) | .compavg |
全成分の平均 |
| compmin(A) | .compmin |
全成分の最小値 |
| compmax(A) | .compmax |
全成分の最大値 |
範囲リマップ 🎚️
入力値の範囲 [from Low, from High] を別の範囲 [to Low, to High] に線形写像
Map from Low .fromlow ⬇️Map from Low (元範囲の下限) — リマップ前の入力値が取りうる最小値を指定。
Map from High .fromhigh ⬆️Map from High (元範囲の上限) — リマップ前の入力値が取りうる最大値を指定。
Map to Low .tolow ⤵️Map to Low (出力範囲の下限) — リマップ後の値域の最小値。
Map to High .tohigh ⤴️Map to High (出力範囲の上限) — リマップ後の値域の最大値。
量子化 .quantize 📏
連続値を離散的な段階値に変換
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off | .off |
量子化を行わない (素通し) |
| Floor | .floor |
切り捨てで離散化 |
| Round | .round |
四捨五入で離散化 |
| Ceiling | .ceiling |
切り上げで離散化 |
| > 0 | .gt0 |
0 より大なら 1、それ以外 0 (閾値判定) |
| >= 0 | .gteq0 |
0 以上なら 1、それ以外 0 |
| == 0 | .eq0 |
0 と等しいなら 1、それ以外 0 |
| != 0 | .neq0 |
0 と異なるなら 1、それ以外 0 |
| <= 0 | .lteq0 |
0 以下なら 1、それ以外 0 |
| < 0 | .lt0 |
0 未満なら 1、それ以外 0 |
キャスト .castto 🔀
出力属性の型を別の型にキャスト
| 項目 | 内部名 | 説明 |
|---|---|---|
| Automatic | .auto |
入力型と演算結果から自動決定 |
| Float | .float |
単精度浮動小数点 (float) に強制 |
| Int | .int |
整数 (int) に強制 |
出力属性スコープ .outputattrscope 📤
演算結果を書き出す出力属性の指定
| 項目 | 内部名 | 説明 |
|---|---|---|
| P | .P |
ポイント位置 (3 成分 float) |
| N | .N |
法線ベクトル (3 成分 float) |
| Color | .Color |
色 (RGBA 4 成分) |
| Color.rgb | .Color.rgb |
色の RGB 3 成分のみ (アルファ除外) |
| Tex | .Tex |
テクスチャ座標 (UV) |
| PointScale | .PointScale |
ポイントスケール属性 |
| LineWidth | .LineWidth |
ラインの太さ属性 |
出力属性オーバーライド 🛡️
出力属性の型・コンポーネント数・デフォルト値を手動で上書き
Override Automatic Attribute .overrideautoattr 🔓Override Automatic Attribute (自動属性上書き) — オンにすると、入力とパラメータから自動決定される属性型を以下の Attribute Type / Components / Default Value で手動上書きできます。
Attribute Type .attrtype 🏷️Attribute Type (属性型) — 出力属性のデータ型 (float / double / int / uint / Color / Direction 等) を選択。
- float (単精度浮動小数点)
- double (倍精度浮動小数点)
- int / uint (整数 / 符号なし整数)
- Color / Color (double) (色、float / double 版)
- Direction / Direction (double) (方向ベクトル、float / double 版)
Components .attrnumcomps 🧮Components (コンポーネント数) — 新規カスタム属性のコンポーネント数 (1〜4) を指定。
Default Value .attrdefaultval 🎁Default Value (デフォルト値) — 演算で算出できないケースに使用される属性の初期値 (コンポーネントごとに最大 4 個指定可能)。
Common Page 🔧
Bypass .bypass 🚫
POP の処理をスキップして入力をパススルーする設定:
- オン: 最初の入力 (input1) をそのまま出力にパススルー、POP 内部の処理を無効化
- 用途: デバッグ時に特定 POP の効果を一時的に外して比較する際に使用
Free Extra GPU Memory .freeextragpumem 🧠
蓄積した GPU メモリの解放:
- Free Extra GPU Memory パルス: 出力ポイント数が増減を繰り返した際に確保されたままの GPU メモリを明示的に解放するパルスパラメータ
- 用途: 大規模パーティクル系で出力サイズが大きく変動した後、未使用メモリを返却して VRAM を節約
Delete Input Attributes .delinputattrs 🗑️
出力属性の絞り込みパターン:
- Delete Input Attributes パターン: 出力に残したい属性名のパターン (例:
P N Cd) を指定。指定外の属性は破棄される - 用途: 下流で不要な属性を切り落として分岐ブランチを軽量化、メモリ・帯域を節約
実践アイデア 💡
Example 1: パーティクルの色を時間で変化 🎨
Particle POP → Math POP (sin on Cd + time Pre Add) → Render TOP
パーティクル各点の色属性 (Cd) に Sin 関数と Pre Add / Multiply の組み合わせを適用し、時間に応じて RGB 成分を周期的に変化させる構成。ビート同期色の演出やアンビエント環境演出の基礎となる。
- Particle POP で動的なポイント群を生成
- Math POP の Attribute Class を Point、Output Attribute Scope に Cd を指定
- Pre Add に
absTime.secondsを流し、Pre Operation を sin、Angle Units を Radians に設定 - Multiply で振幅 (0.5)、Post Add で中心値 (0.5) を加えて [0,1] レンジに収束
Example 2: ジオメトリ位置の範囲リマップ 📐
Box POP → Math POP (Map from/to + Scope P) → Render TOP
Box POP の頂点位置 (P) を Math POP の Map from Low/High と Map to Low/High で別の値域に変換し、シェーダで扱いやすい [0,1] 正規化座標へ落とし込む例。テクスチャ UV 生成やマスク作成にも応用可能。
- Box POP で立方体ジオメトリを生成 (P 範囲はおおよそ [-1, 1])
- Math POP の Input Attribute Scope に
P、Output Attribute Scope にPを指定 - Map from Low/High を [-1, 1]、Map to Low/High を [0, 1] に設定
- 下流のシェーダで P を直接 UV として参照
Example 3: 法線ベクトルの正規化 🧭
In POP → Math POP (normalize + Cast to Direction) → Render TOP
上流から流れてきた法線属性 (N) を Math POP の normalize 演算で単位ベクトル化し、シェーダ計算で安定した照明結果を得るための前処理として用いる。スケーリング後の法線崩れを補正する定番フロー。
- In POP で上流ジオメトリを受け取る
- Math POP の Output Attribute Scope に
Nを指定し Pre Operation を normalize に設定 - Cast to を Direction にして下流シェーダで方向ベクトルとして扱う
関連オペレータ 🔗
類似機能OP 🔍
- Math Combine POP — 複数入力属性の数学的合成
- Math Mix POP — 重み付きで複数属性をブレンド
- Limit POP — 属性値を範囲内にクランプ
- Normalize POP — ベクトル属性の単位化に特化
- Lookup Attribute POP — 別属性をキーにテーブル参照で値変換
組み合わせ推奨OP 🔄
- Attribute POP — 新規属性を追加してから Math POP で値を計算
- Attribute Combine POP — 複数属性を 1 つに結合した後 Math POP で正規化
- Attribute Convert POP — 属性クラスを変換した後 Math POP で再計算
- Noise POP — ノイズで生成した値を Math POP でスケール・オフセット
- Math CHOP — チャンネル側の数学演算と組み合わせて GPU/CPU を跨いだ制御
前処理・後処理POP 🎯
- 前処理: In POP、File In POP、Box POP、Particle POP、Attribute POP
- 後処理: Out POP、Limit POP、Normalize POP、Null POP
Info情報 📊
POP ファミリには専用の Info OP が存在しません。Math POP の出力情報は下流の Null POP で値を確認したり、Python から POP クラスメンバーで取得します。
POP固有情報 ✨
num_verts: POP に含まれる頂点 (vertex) 数num_points: POP に含まれるポイント数num_prims: POP に含まれるプリミティブ数
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号cook_abs_frame: 最後にクックされた絶対フレーム番号 (アプリケーション起動からの累積)cook_start_time: 最後のクック開始時刻 (ミリ秒)cook_end_time: 最後のクック終了時刻 (ミリ秒)cooked_this_frame: 現フレームでクックされたか (0 / 1)warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: 演算結果が反映されない
✅ Solution:
Attribute Classが対象属性のクラス (Point / Vertex / Primitive) と一致しているか確認Input Attribute Scope/Output Attribute Scopeに対象属性名 (P / N / Cd 等) が含まれているか確認- 上流に同名属性が存在しない場合は Attribute POP で先に属性を追加
❌ Problem: 値が想定範囲を超えてオーバーフローする
✅ Solution:
Pre Operation/Post Operationでsquareやinverse等を選んでいないか確認QuantizeやMap from/toで適切な範囲に丸める- 下流に Limit POP を挟んで値域をクランプ
❌ Problem: 三角関数の結果が想定と違う
✅ Solution:
Angle Unitsが入力データと合っているか (Degrees / Radians / Cycles) 確認- sin / cos / tan は
Angle Unitsの影響を受けるため単位ミスマッチに注意 - ラジアン入力したい場合は
radians()演算で度数を変換するか Angle Units を Radians に切替
❌ Problem: 出力型がシェーダ側で扱いにくい
✅ Solution:
Cast toで Float / Int に明示的に変換- ベクトル属性なら
Override Automatic Attributeを有効化しAttribute Typeを Direction に固定 Componentsでコンポーネント数を明示しシェーダ側の vec3 / vec4 と合わせる
参考資料 📚
その他 🔗
- TouchDesigner Wiki — POP 概要
- TouchDesigner Wiki — Category:POPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

