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

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

LSystem SOP の枝分かれ生成機能を示す図

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

概要 📖 – 規則で枝分かれを生成

LSystem SOPは、L-system の文字列書換規則を反復評価し、タートルグラフィクスで枝分かれするジオメトリを生成する SOPです。公理 (premise) と書換規則 (rules) を Table DAT 等で記述し、Generations の回数だけ規則を再帰適用してラインまたはチューブ形状を出力します。

主な用途 🎯

  • L-system 規則による植物状の枝分かれ形状の手続き的生成
  • フラクタル幾何や自己相似形の生成
  • Generations を時間関数化したアニメーション (成長表現)
  • 葉や花などのパーツを別 SOP として参照する有機的なシーン構築
  • ランダムシードと Random Scale による個体差のあるバリエーション生成

データフロー 🔄

入力: なし (規則文字列とパラメータから生成)

タートルグラフィクスによる L-system 評価

出力: ライン / チューブジオメトリ

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

Geometry Page 📐

Type 設定 .type 🎛️

出力ジオメトリの種類を選択するメニュー

項目 内部名 説明
Skeleton .skel ワイヤフレーム (細線) ジオメトリを生成。稲妻や雪の結晶のような硬く角張った形状に最適で、SOP のクック時間の削減にも役立ちます
Tube .tube チューブ (立体) ジオメトリを生成。樹木や低木のように滑らかな曲線が必要な形状に向きます。この選択時のみ Tube Page のパラメータが有効になります

生成パラメータ 🌱

Generations .generations 🔁
Generations (世代数) — 規則を初期文字列に適用する回数
– L-system の成長を制御します。時間関数を入れると成長アニメーションになります

Random Scale .randscale 🎲
Random Scale (ランダムスケール) — 長さ・角度・太さに加える乱数振れ幅 (%)
– 0 で完全に決定的、大きいほど個体差が出ます

Random Seed .randseed 🌀
Random Seed (乱数シード) — SOP 用の乱数シード値
– 異なる値で異なる乱数列を得られます

Continuous Angles .contangl 📐
Continuous Angles (連続角度) — 非整数の Generations 値で枝の角度を補間
– Generations をアニメーションさせる場合に滑らかな成長を保証します

Continuous Length .contlength 📏
Continuous Length (連続長さ) — 非整数の Generations 値で長さを補間
– Continuous Angles と同様、Generations のアニメーション時に滑らかさを保ちます

Continuous Width .contwidth 📏
Continuous Width (連続太さ) — 非整数の Generations 値でチューブ太さを補間
– チューブ出力時の太さ変化をアニメーションで滑らかにします

Apply Color .docolor 🎨
Apply Color (色の適用) — 成長中の L-system に TOP から色を適用するかを切り替え

Image File .colormap 🖼️
Image File (カラーマップ TOP) — Apply Color オン時に参照する TOP
– タートル演算子 `# でも参照する形式に対応

UV Increment .inc 📊
UV Increment (UV 増分) — タートル演算子 ` または # 使用時のデフォルト U/V インデックス増分

Point Width Attribute .pointwidth 📍
Point Width Attribute (ポイント太さ属性) — 各ポイントに太さ属性を付与
– Tube Page の Thickness と Thickness Scale が反映されます


Tube Page 🌲

チューブ形状 🛢️

Rows .rows 🔲
Rows (行数) — チューブの分割数、または辺の長さあたりの分割数

Columns .cols 🔳
Columns (列数) — チューブの側面数、または辺の長さあたりの分割数

Tension .tension 〰️
Tension (テンション) — 枝分かれの角の滑らかさを制御

Branch Blend .smooth 🔗
Branch Blend (枝接続ブレンド) — 子の枝を親の枝に連続的に接続

Thickness .thickinit 📏
Thickness (太さ) — チューブのデフォルト太さ

Thickness Scale .thickscale 📐
Thickness Scale (太さスケール) — タートル演算子 ! または ? 使用時の倍率

Apply Tube Texture Coordinates .dotexture 🎨
Apply Tube Texture Coordinates (テクスチャ座標) — 有効時にチューブセグメントへ UV を付与
– 枝の上にテクスチャが滑らかに連続するように配置されます

Vertical Increment .vertinc ⬆️
Vertical Increment (垂直増分) — チューブ上のテクスチャ UV の垂直方向の間隔


Values Page 🔢

サイズと角度 📐

Step Size .stepinit 📏
Step Size (歩幅) — 新規ジオメトリ生成時の辺のデフォルト長さ

Step Size Scale .stepscale 📐
Step Size Scale (歩幅スケール) — タートル演算子 " または _ 使用時の倍率

Angle .angleinit 📐
Angle (回転角度) — 旋回・ロール・ピッチのデフォルト角度

Angle Scale .anglescale 🔄
Angle Scale (角度スケール) — タートル演算子 ; または @ 使用時の倍率

Variable b .varb 🅱️
Variable b (変数 b) — 規則や premise 中の b に展開される文字列
$F$T 等のシステム変数も使用可能

Variable c .varc 🔣
Variable c (変数 c) — 規則や premise 中の c に展開される文字列

Variable d .vard 🔡
Variable d (変数 d) — 規則や premise 中の d に展開される文字列

Gravity .gravity ⬇️
Gravity (重力) — タートル演算子 T (tropism ベクトル) で適用される重力の強さ
– 太い枝より細い枝、短い枝より長い枝が大きく曲がります


Funcs Page 🧩

関数と参照 🔗

Pic Image TOP .pictop 🖼️
Pic Image TOP (画像参照 TOP) — 規則内の pic() 関数が参照する TOP

Group Prefix .grpprefix 🏷️
Group Prefix (グループ接頭辞) — 規則中で g(n) が現れた場合、以降のジオメトリは「この接頭辞 + n の ASCII 値」のプリミティブグループに含められます

Channel Prefix .chanprefix 📻
Channel Prefix (チャンネル接頭辞) — 規則中で chan(n) が現れた場合、ローカルチャンネル名「この接頭辞 + n の ASCII 値」で置換されます

Leaf Param A .stampa 🍃
Leaf Param A (葉用パラメータ A) — 葉に使われるパラメータを指定可能

Leaf Param B .stampb 🍃
Leaf Param B (葉用パラメータ B) — 葉に使われるパラメータを指定可能

Leaf Param C .stampc 🍃
Leaf Param C (葉用パラメータ C) — 葉に使われるパラメータを指定可能

Rules DAT .rules 📜
Rules DAT (規則 DAT) — L-system の規則を定義する DAT へのパス
context_ignore 行でコンテキスト感度のテスト時にスキップする文字を指定できます
premise 行で初期文字列を定義し、Rules 行で書換規則を記述します


Common Page 🔧

ジオメトリ統計 .sop_geometry_stats 📐

全 SOP 共通のジオメトリ統計 Info CHOP チャンネル:

  • num_points: num_points — この SOP に含まれるポイント数
  • num_prims: num_prims — この SOP に含まれるプリミティブ数
  • num_particles: num_particles — この SOP に含まれるパーティクル数

GPU 転送タイミング .sop_vbo_timing 🎮

GPU 転送タイミング Info CHOP チャンネル (別スレッド、フレーム時間外):

  • last_vbo_update_time: last_vbo_update_time — 別スレッドで SOP の CPU データを GPU 上のジオメトリデータに更新するのにかかった時間。別スレッドのためフレーム時間には含まれません
  • last_meta_vbo_update_time: last_meta_vbo_update_time — 別スレッドで metaball や NURBS のようなメタサーフェスジオメトリデータを GPU に更新するのにかかった時間。別スレッドのためフレーム時間には含まれません

クック統計 .sop_cook_stats ⏱️

クック実行統計 Info CHOP チャンネル:

  • total_cooks: total_cooks — プロセス開始以降にこのオペレータがクックされた合計回数
  • cook_time: cook_time — 直近のクック所要時間 (ミリ秒)
  • cook_frame: cook_frame — このオペレータが最後にクックされた時のフレーム番号 (コンポーネントタイムライン相対)
  • cook_abs_frame: cook_abs_frame — このオペレータが最後にクックされた時のフレーム番号 (絶対時間相対)
  • cook_start_time: cook_start_time — クックされたフレーム内でオペレータがクック開始した時間 (ミリ秒)
  • cook_end_time: cook_end_time — クックされたフレーム内でオペレータがクック終了した時間 (ミリ秒)
  • cooked_this_frame: cooked_this_frame — 当該フレームでクックされた場合は 1

警告・エラー .sop_diagnostics ⚠️

警告・エラー Info CHOP チャンネル:

  • warnings: warnings — このオペレータの警告数 (あれば)
  • errors: errors — このオペレータのエラー数 (あれば)

実践アイデア 💡

Example 1: 枝分かれする樹木の生成 🌳

Table DAT (rules) → LSystem SOP → Material SOP → Geometry COMP

Table DAT に premise と書換規則を記述し、LSystem SOP の Rules DAT に紐付けて Generations を上げると枝分かれする樹木状ジオメトリが生成されます。Type を Tube にして Thickness を調整すると立体的な幹と枝になります。

  1. Table DAT を配置し premise (例: F) と rules (例: F=F[+F]F[-F]F) を 2 行で記述
  2. LSystem SOP の Rules DAT パラメータに Table DAT のパスを指定
  3. Generations を 3〜5 に設定して Angle を 22.5 度前後にする
  4. Type を Tube に切り替えて Thickness で太さを調整
  5. Geometry COMP に LSystem SOP を入れて Material と合わせてレンダリング

Example 2: 成長アニメーション 🌱

Time → LSystem SOP (Generations / Continuous*) → Render

Generations に absTime.seconds 等の時間関数を入れると L-system が時間とともに成長する表現になります。Continuous Angles / Length / Width をオンにすると非整数の Generations 値でも滑らかな成長になります。

  1. LSystem SOP の Generations パラメータに時間関数 (例: absTime.seconds * 0.5) を入力
  2. Continuous Angles / Continuous Length / Continuous Width をすべてオンにする
  3. 再生して非整数値での補間によって枝が連続的に伸びる挙動を確認

Example 3: 葉や粒子へ展開 ✨

LSystem SOP → Copy SOP / Particle SOP → Render

LSystem SOP の枝先に Copy SOP で葉や花を複製したり、Particle SOP のエミッタとして使用して有機的なパーティクル放出に展開できます。

  1. LSystem SOP で枝のラインを生成 (Type=Skeleton)
  2. Copy SOP で葉モデルを枝の点に複製、または Particle SOP のソースとして接続
  3. Render TOP で最終出力を確認

関連オペレータ 🔗

類似機能OP 🔍

  • Particle SOP — 手続き的なジオメトリ生成 SOP
  • Noise SOP — ノイズ関数によるジオメトリ変形

組み合わせ推奨OP 🔄

  • Copy SOP — 枝先のポイントに葉や花を複製
  • Material SOP — 生成された枝にマテリアルを割り当て
  • Geometry COMP — シーン中に LSystem ジオメトリを配置
  • Table DAT — Rules DAT として premise と書換規則を保持

前処理・後処理SOP 🎯


Info情報 📊

LSystem SOP は全 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: このオペレータのエラー数

SOP 共通情報 📊

  • num_points: num_points — 出力ジオメトリのポイント数
  • num_prims: num_prims — 出力ジオメトリのプリミティブ数
  • last_vbo_update_time: last_vbo_update_time — GPU 側 VBO 更新に費やされた時間 (ミリ秒、別スレッド)
  • total_cooks: total_cooks — プロセス開始以降のクック回数
  • cook_time: cook_time — 直近のクック所要時間 (ミリ秒)

トラブルシューティング ⚠️

よくある問題と解決策 🔧

❌ Problem: ジオメトリが生成されない・出力が空
✅ Solution:

  • Rules DAT のパスが正しく Table DAT を指しているか確認
  • Table DAT の最初の行に premise (初期文字列、例: F) が記述されているか確認
  • Generations が 0 になっていないか確認 (1 以上にする)

❌ Problem: 枝が太すぎる・細すぎる
✅ Solution:

  • Tube Page の Thickness でデフォルト太さを調整
  • Thickness Scale!? 演算子使用時の倍率を変更
  • Point Width Attribute をオンにしてポイントごとの太さ属性を活用

❌ Problem: Generations をアニメーションすると形状がカクつく
✅ Solution:

  • Continuous Angles をオンにして非整数 Generations での角度補間を有効化
  • Continuous Length もオンにして長さの補間を有効化
  • Type=Tubes の場合は Continuous Width もオンにして太さの補間も有効化

❌ Problem: 重力で枝を曲げたい
✅ Solution:

  • Values Page の Gravity を 0 より大きい値に設定
  • 規則中で tropism ベクトルを示す T 演算子を併用
  • 細く長い枝ほど大きく曲がる挙動を確認しながら値を調整

参考資料 📚

その他 🔗

公式リソース 📖

この記事は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をコピーしました