Math POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

※当サイトにはプロモーションリンクが含まれます。

Math POP の属性演算機能を示す図

記事更新の通知はXでアナウンス٩(๑❛ᴗ❛๑)
@maru6o6をフォロー

概要 📖 – 属性値を演算で変換

Math POPは、入力ジオメトリの属性値に対して加算・乗算・関数変換・範囲リマップなどの数学演算を一括で適用する POPです。ポイント・頂点・プリミティブの各属性クラスごとに、Pre/Post 演算・スケーリング・量子化・型キャストなど多彩な操作を 1 ノードで実現します。

主な用途 🎯

  • ポイント位置 (P) の一括スケーリング・オフセット計算
  • 色 (Cd) や法線 (N) などの属性値の正規化・範囲リマップ
  • パーティクルの寿命・サイズ属性の数学的変換
  • 角度単位の変換 (Degrees / Radians / Cycles) と三角関数の適用
  • 出力属性のキャスト変換 (float / int / Color / Direction) とコンポーネント数調整

データフロー 🔄

入力: POP ジオメトリ(属性付き)

属性スコープと演算設定に基づく数学処理

出力: 同形状ジオメトリ(演算後の属性値)

Tips

初心者の方は、以下日本語書籍も手元にあると安心です。

まる。
まる。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!


パラメータ解説 ⚙️

Math Page 📋

属性クラス .attrclass 🧱

演算対象とする属性の所属クラス (点・頂点・面) を指定

項目 内部名 説明
Point .point ポイント属性 (位置 P や色 Cd 等、頂点共有データ) を対象に演算
Vertex .vertex 頂点属性 (Tex 等、プリミティブ別に持つデータ) を対象に演算
Primitive .primitive プリミティブ属性 (面単位で持つ法線や色 等) を対象に演算

グループとスコープ 🎯

Group .group 🗂️
Group (グループ名) — 入力にグループがある場合、ここで名前を指定するとそのグループ内の要素のみを対象に演算します。空欄なら全体に適用。

Input Attribute Scope .inputattrscope 🔍
Input Attribute Scope (入力属性スコープ) — 指定した属性クラスの中で、どの属性 (例 PCd) のどのコンポーネントを演算対象にするかをパターンで絞り込みます。

角度単位 .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 成分を周期的に変化させる構成。ビート同期色の演出やアンビエント環境演出の基礎となる。

  1. Particle POP で動的なポイント群を生成
  2. Math POP の Attribute Class を Point、Output Attribute Scope に Cd を指定
  3. Pre Add に absTime.seconds を流し、Pre Operation を sin、Angle Units を Radians に設定
  4. 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 生成やマスク作成にも応用可能。

  1. Box POP で立方体ジオメトリを生成 (P 範囲はおおよそ [-1, 1])
  2. Math POP の Input Attribute Scope に P、Output Attribute Scope に P を指定
  3. Map from Low/High を [-1, 1]、Map to Low/High を [0, 1] に設定
  4. 下流のシェーダで P を直接 UV として参照

Example 3: 法線ベクトルの正規化 🧭

In POP → Math POP (normalize + Cast to Direction) → Render TOP

上流から流れてきた法線属性 (N) を Math POP の normalize 演算で単位ベクトル化し、シェーダ計算で安定した照明結果を得るための前処理として用いる。スケーリング後の法線崩れを補正する定番フロー。

  1. In POP で上流ジオメトリを受け取る
  2. Math POP の Output Attribute Scope に N を指定し Pre Operation を normalize に設定
  3. Cast to を Direction にして下流シェーダで方向ベクトルとして扱う

関連オペレータ 🔗

類似機能OP 🔍

組み合わせ推奨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 🎯


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 Operationsquareinverse 等を選んでいないか確認
  • QuantizeMap 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 と合わせる

参考資料 📚

その他 🔗

公式リソース 📖

この記事はLLMと共に内容を執筆、更新しています。
最新バージョンとの項目差異など、情報の不一致を見つけた心優しい方はXもしくはInsta、メールなどよりサイト管理者までご連絡ください😎


まる。

お仕事のご依頼はDM又はメールにて。
━━━━━━━━━━━━━━━━━
Python/Touchdesigner/M5Stackをこよなく愛すフルスタックエンジニア。
専門は生理心理学、趣味はヨガやサウナ、EMS電気風呂などヘルスケア全般。
脳波や筋電、心拍を中心とした生体情報のセンシング&インタラクティブアートづくりがライフワーク。

普段はワントゥーテンという会社で空間演出エンジニアをしています。
リファラル採用お繋ぎできますので、我こそはという尖った方は経歴と希望職種添えてDMください(エンジニア以外、営業職等もOK)。
ご飯行きましょう。

↓日常垢
Instagram:@malmal0v0

まる。をフォローする
その他の記事はこちら
Math Combine POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED Select TOP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
ZED POP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Window COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】
Widget COMP 完全ガイド | 使い方・パラメータ解説【TouchDesigner】

タイトルとURLをコピーしました