
概要 📖 – 数式から3D等値面を生成
Iso Surface SOPは、陰関数 f(x,y,z)=0 で定義した3次元の等値面をポリゴンメッシュとして出力する SOPです。Minimum / Maximum Bound で評価範囲を、Divisions で解像度を決め、Implicit Function に書いた数式から代数的・解析的な3D曲面を直接構築します。
主な用途 🎯
- 陰関数 (implicit function) で定義したアイソサーフェスのポリゴン化
- 楕円体・双曲放物面 (サドル) などの代数的曲面の生成
- プロシージャルなブロブ形状や有機的ジオメトリのスケッチ
- 数式可視化や教育コンテンツ向けの数学曲面の表示
- Metaball SOP の代替として任意の連続関数からサーフェスを構築
データフロー 🔄
入力: なし (パラメータの数式のみ)
↓
指定境界内を Divisions で離散化
↓
各セルで陰関数 f(x,y,z)=0 のアイソサーフェスをポリゴン化
↓
出力: ポイントとポリゴンを持つ SOP
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Page 📁
陰関数定義関連パラメータ 🧮
Implicit Function .func 🧮
– Implicit Function (陰関数式) — アイソサーフェスを構築する数式を Python 式として記述する
– me.curPos.x / me.curPos.y / me.curPos.z で評価点の座標を参照する
– 例 1 (双曲放物面 / サドル形状): (me.curPos.x**2)/(4*4) - (me.curPos.y**2)/(3*3) + me.curPos.z
– 例 2 (楕円体): (me.curPos.x**2)/0.1 + (me.curPos.y**2)/2 + (me.curPos.z**2)/6 - 1
境界関連パラメータ 📐
Minimum Bound .min 🔻
– Minimum Bound (最小境界) — アイソサーフェスを表示するクリッピング平面の最小側の境界を決定する
– X / Y / Z 各軸方向の評価開始位置を指定する
- X 軸方向の最小値
- Y 軸方向の最小値
- Z 軸方向の最小値
Maximum Bound .max 🔺
– Maximum Bound (最大境界) — アイソサーフェス表示のクリッピング平面の最大側の境界を決定する
– X / Y / Z 各軸方向の評価終了位置を指定する
- X 軸方向の最大値
- Y 軸方向の最大値
- Z 軸方向の最大値
解像度関連パラメータ 🧱
Divisions .divs 🔢
– Divisions (分割数) — X / Y / Z 各方向のアイソサーフェスポリゴンの密度・解像度を指定する
– 値が大きいほど滑らかな曲面になるが、ポリゴン数とクック時間が増加する
- X 軸方向の分割数
- Y 軸方向の分割数
- Z 軸方向の分割数
法線関連パラメータ 🧭
Compute Normals .normals 🧭
– Compute Normals (法線計算) — 生成したアイソサーフェスに法線属性を付与する
– オフの場合、後段で法線を別途計算する必要がある (シェーディングが正しく出ない原因になる)
実践アイデア 💡
Example 1: 楕円体の等値面を生成 🌐
Iso Surface SOP (Implicit Function=楕円体式, Divisions=40 40 40) → Geometry COMP → Render TOP
Iso Surface SOP 単体で楕円体の陰関数を評価し、Geometry COMP に渡してレンダリングする最小構成。数式可視化や3D形状の試作の起点として使えます。
- Iso Surface SOP を配置する
Implicit Functionに(me.curPos.x**2)/0.1 + (me.curPos.y**2)/2 + (me.curPos.z**2)/6 - 1を入力Minimum Boundを-3 -3 -3、Maximum Boundを3 3 3に設定Divisionsを40 40 40に設定して曲面の滑らかさを確保- Geometry COMP に接続し Render TOP で楕円体が描画されることを確認
Example 2: サドル曲面を作って変形 🎢
Iso Surface SOP (双曲放物面式) → Transform SOP → Material SOP → Geometry COMP
双曲放物面 (サドル) の陰関数からアイソサーフェスを生成し、Transform SOP で位置・スケールを調整したうえで Material SOP でマテリアルを割り当てるパイプライン。代数曲面を素材にしたビジュアルの起点として有効です。
- Iso Surface SOP の
Implicit Functionに(me.curPos.x**2)/(4*4) - (me.curPos.y**2)/(3*3) + me.curPos.zを入力 Minimum Bound/Maximum Boundでサドル全体が収まる範囲を設定- 後段に Transform SOP を配置して位置・回転・スケールを補正
- Material SOP でレンダリング用マテリアルを割り当て、Geometry COMP に接続
- Render TOP でサドル形状が陰影付きで表示されることを確認
Example 3: 有機的なブロブ生成 🫧
Iso Surface SOP (複数の球の合成式) → Facet SOP (法線スムーズ化) → Geometry COMP
複数のガウシアン的な項を合算した陰関数を Iso Surface SOP に与え、Metaball SOP の代替として有機的なブロブ形状を生成する例。任意の連続関数を扱えるため、Metaball では表現しにくい形状にも展開しやすいのが利点です。
Implicit Functionに 2 つ以上の球関数を足した式 (例:1/((me.curPos.x-1)**2 + me.curPos.y**2 + me.curPos.z**2 + 0.1) + 1/((me.curPos.x+1)**2 + me.curPos.y**2 + me.curPos.z**2 + 0.1) - 1.5) を入力Divisionsを60 60 60程度に上げて滑らかな結合面を確保- 後段に Facet SOP を配置し法線をスムーズ化
- Geometry COMP に接続してブロブ形状をレンダリングし、項を増減して形状変化を確認
関連オペレータ 🔗
類似機能OP 🔍
- Metaball SOP — ガウス分布の暗黙的曲面で球状のブロブを合成する SOP
- Particle SOP — 粒子シミュレーションから派生形状を生成 (陰関数ベースではないが代替起点として)
組み合わせ推奨OP 🔄
- Transform SOP — Iso Surface で生成した曲面の位置・回転・スケールを後段で補正
- Facet SOP — アイソサーフェスのポリゴン法線をスムーズ化または再計算
- Convert SOP — 出力ポリゴンを NURBS / Bezier 等別表現に変換
- Geometry COMP — 生成したアイソサーフェスをレンダリングパイプラインに投入
前処理・後処理SOP 🎯
Info CHOP情報 📊
Iso Surface SOP は Info CHOP による詳細情報取得に対応しています。
ジオメトリ統計 📐
num_points: この SOP に含まれるポイント数num_prims: この SOP に含まれるプリミティブ数num_particles: この SOP に含まれるパーティクル数
GPU 転送タイミング 🎮
last_vbo_update_time: 別スレッドで SOP の CPU データを GPU 上のジオメトリデータに更新するのにかかった時間 (フレーム時間外)last_meta_vbo_update_time: 別スレッドで metaball や NURBS のようなメタサーフェスジオメトリデータを GPU に更新するのにかかった時間 (フレーム時間外)
汎用オペレータ情報 🔄
total_cooks: プロセス開始以降にこのオペレータがクックされた合計回数cook_time: 直近のクック所要時間 (ミリ秒)cook_frame: このオペレータが最後にクックされたフレーム番号warnings: このオペレータの警告数errors: このオペレータのエラー数
クック統計 ⏱️
total_cooks:total_cooks— プロセス開始以降にこのオペレータがクックされた合計回数cook_time:cook_time— 直近のクック所要時間 (ミリ秒)。Divisions を上げると増加するcook_frame:cook_frame— このオペレータが最後にクックされたフレーム番号
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: アイソサーフェスがまったく表示されない
✅ Solution:
Implicit Functionに書いた数式が指定した境界内で 0 を横切る点を持つか確認 (符号変化がないと等値面は生成されない)Minimum Bound/Maximum Boundを広げて、曲面が評価範囲外に出ていないか確認Divisionsが極端に小さい場合は曲面が離散セルに収まらず描画されない — 各軸 20 以上から試す
❌ Problem: 曲面がカクカク (低ポリ) になる
✅ Solution:
Divisionsを X / Y / Z 各方向で増やしてセル密度を上げる (例: 20 → 60)- 後段に Facet SOP を配置し法線をスムーズ化する
- Bounds を実際の曲面サイズに合わせて絞り込み、同じ Divisions でも単位セルを細かくする
❌ Problem: シェーディングがおかしい / 真っ黒になる
✅ Solution:
Compute Normalsがオンになっているか確認 (オフだと法線属性が無く、シェーダが正しく光を計算できない)- 後段に Facet SOP を入れて法線を再計算する
- Material 側の Two-Sided Lighting を有効にして裏面の暗黒化を回避する
❌ Problem: クック時間が長い / フレームレートが落ちる
✅ Solution:
Divisionsを必要最小限に下げ、見た目に影響しない範囲で評価点数を削減するMinimum Bound/Maximum Boundを曲面が実際に存在する領域に絞り、無駄な評価セルを減らす- 後段に Polyreduce SOP を入れてポリゴン数を間引き、下流の負荷も軽減する
参考資料 📚
その他 🔗
- TouchDesigner Wiki — SOP 概要
- TouchDesigner Wiki — Category:SOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – Iso Surface SOP
- TouchDesigner公式ドキュメント – Metaball SOP
- TouchDesigner公式ドキュメント – Facet SOP

