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

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

Ray SOP のレイ投影 (Minimum Distance / Project Rays) で点を他形状の表面に着地させる図

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

概要 📖 – 他形状の表面に点を投影する

Ray SOPは、入力ジオメトリのポイントを別形状 (衝突面) に向けて投影し、表面に着地させた位置・法線・距離属性を更新する SOPです。投影方法は Method パラメータで Minimum Distance (最近接吸着) と Project Rays (法線方向飛ばし) から選択でき、Bounces / Scale / Lift / Sample で着地挙動を細かく制御できます。

主な用途 🎯

  • シュリンクラップ (Minimum Distance モード) によるジオメトリの吸着で、平面メッシュを地形・キャラクターモデルなど別形状の表面にぴったり貼り付け、低解像度メッシュからディテール形状を派生させる
  • 法線方向への投影 (Project Rays モード)で、入力ポイントを自身の法線方向に飛ばして衝突したポイントへ移動させ、布のような被覆・スタンプ表現を 1 ノードで実現
  • 反射バウンス (Bounces) によるレイ追跡表現で、入力ポイントから発射したレイを衝突面で反射させ、簡易レイトレース・反射点群・コースティック様のエフェクトを生成
  • 距離属性 ($DIST) と法線属性の自動付与で、衝突面までの距離や衝突地点の法線を各ポイントに記録し、後段の Point SOP や CHOP 経由で形状制御・色付けに転用
  • サンプル数 (Sample) とジッタ (Jitter Scale) によるソフト投影で、1 ポイントから複数本のレイをランダムに飛ばして平均化し、ノイズや段差のある衝突面に対して滑らかな投影結果を得る

データフロー 🔄

入力 1: 投影元ポイント群 (source geometry)

入力 2: 衝突面となる別形状 (collision geometry)

Method で Minimum Distance / Project Rays を選択

Bounces / Scale / Lift / Sample などで投影挙動を制御

出力: 衝突面に着地したポイント位置 + 法線・距離属性

Tips

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

まる。
まる。

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


パラメータ解説 ⚙️

Page 📁

対象グループ指定 🎯

Group .group 🎯
Group (対象グループ名) — 入力 1 のポイントグループ名を指定すると、そのグループに属するポイントのみが Ray の投影対象になります
– 空欄の場合は入力 1 の全ポイントが投影されます
*[0-9] 等のパターンマッチング表記が使えるため、複数グループをまとめて指定可能

投影方法の選択 .method 🔄

Method (投影方法) — 入力 1 のポイントを入力 2 の表面にどのように投影するかを選択するメニューパラメータ。法線情報を使わない最近接吸着と、法線方向に飛ばすレイ投影の 2 種類があります。

項目 内部名 説明
Minimum Distance .minimum 入力 1 の各ポイントを、入力 2 の表面のうち最も近い点に移動させます。ポイントの法線情報は使われないため、シュリンクラップ (薄膜被覆) のように 1 つの形状の表面に別形状をぴったり吸着させる用途に最適。
Project Rays .project 入力 1 の各ポイントを、その法線方向に沿ってレイとして飛ばし、入力 2 の表面と最初に交差した点まで移動させます。法線方向に応じた投影が必要な被覆・スタンプ・反射表現に向いています。

投影動作の制御 ⚙️

Transform Points .dotrans
Transform Points (ポイント位置の更新) — 有効にすると、投影結果に従って入力ポイントの位置が実際に移動します
– 無効にすると位置は移動せず、法線・距離などのポイント属性のみが更新されます (元の形状を保持しながら属性だけ取得したい場合に有用)

Intersect Farthest Surface .lookfar 🎯
Intersect Farthest Surface (最遠面との交差) — 有効にすると、レイが複数の面と交差する場合に最も遠い (奥の) 面を採用します
– デフォルト (無効) では最も近い面に着地。中空構造や複数レイヤーの形状で、外殻ではなく裏側の面を取りたいときに有効化

法線属性の更新 .normal 📐

Point Intersection Normal (法線属性の更新方法) — 投影後に各ポイントへ書き込まれる法線の取り方を選択します。投影に失敗した (どの面とも交差しなかった) ポイントには法線 (0,0,0) が入ります。

項目 内部名 説明
Source Normal .source 入力 1 のポイントが元々持っていた法線をそのまま維持します。元の形状の向きを保ったまま位置だけを衝突面に合わせたいときに使用。
Collision Normal .collision 衝突した側 (入力 2) の表面の法線を各ポイントに書き込みます。衝突面の向きに沿った後段処理 (シェーディング・面方向に揃えたコピー配置) に必須。
Reflected Ray .reflect 入射レイが衝突面で反射した方向ベクトルを法線として書き込みます。バウンス反射表現や、反射方向に応じた可視化に使用。

反射バウンス設定 🔁

Bounces .bounces 🔁
Bounces (反射バウンス回数) — 衝突面で反射したレイを何回再投影するかを指定。1 では最初に当たった面で停止、2 以上では反射方向に再度レイを飛ばして次の衝突点を求めます
– 簡易レイトレースや、ミラーボール風の反射点群表現を作る際に使用
– バウンス回数が増えると計算負荷も比例して増えるため、必要最小限の回数に留めるのが定石

Save Bounce Geometry .bouncegeo 💾
Save Bounce Geometry (バウンス時のジオメトリ保存) — 有効にすると、各バウンス段階のジオメトリが個別のコピーとして保存され、最終出力に複数の投影スナップショットが含まれます
– レイの経路を可視化したい場合や、複数のバウンス位置を後段で線分として接続したい場合に有効化

距離属性とスケール 📏

Point Intersection Distance .putdist 📏
Point Intersection Distance (距離属性 $DIST の書き込み) — 有効にすると、各ポイントから衝突面までの距離が $DIST ポイント属性に書き込まれ、後段の Point SOP から参照できます
– 衝突しなかったポイントには距離 0 が入ります
– 距離に応じてポイントの色や大きさを変える表現で頻用

Scale .scale 📐
Scale (投影率) — 投影量のスケーリング。0 は移動なし (位置を保持)、1 はちょうど衝突面に着地
– 負値や 1 を超える値も有効で、衝突面を貫通・手前で止めるような中間表現を作れる
– 0 → 1 をアニメーションさせると、ジオメトリが徐々に表面へ吸着するモーフ演出になる

Lift .lift ⬆️
Lift (衝突面からの法線方向オフセット) — 衝突面から法線方向にどれだけ持ち上げるかを指定
– 0 では完全に表面に貼り付き、正の値では表面から少し浮かせて配置できる
– 表面に貼り付けた装飾物が Z-fighting を起こすのを防ぐ用途で、わずかな値 (0.001 など) を入れるのが定石

サンプリング設定 🎲

Sample .sample 🎲
Sample (サンプル数) — 1 ポイントから飛ばすレイの本数。1 では従来通り 1 本のみ、2 以上では追加レイがランダムに摂動 (Jitter Scale で制御) され、衝突結果が平均化されます
– ノイズの多い衝突面や、凹凸のある面に対して滑らかな投影結果を得たい場合に有効
– サンプル数が増えると計算負荷も比例して増えるため、ビジュアル品質と負荷のバランスを見て調整

Jitter Scale .jitter 🌫️
Jitter Scale (ジッタの強さ) — 追加サンプルレイをランダムに揺らす量
– 値が大きいほど広範囲を平均サンプリングし、衝突面のディテールがぼやけたソフトな投影結果になる
– 0 だと追加サンプルも同じ方向に飛ぶため、Sample を増やしても効果が出ない点に注意

Seed .seed 🌱
Seed (乱数シード) — Sample > 1 のときの摂動パターンを決める乱数シード
– 同じシードなら同じ投影結果が再現される。アニメーションごとに異なる結果が欲しいときは別のシードに切り替える

ヒット点グループ化 🅰️

Create Point Group .newgrp 🅰️
Create Point Group (ヒットポイントのグループ化) — 有効にすると、衝突に成功したポイントだけを集めたポイントグループが自動的に作成されます
– 衝突に失敗したポイント (穴に落ちた・距離が遠すぎた) を後段で除外したいときに便利
– グループ名は次の Ray Hit Group で指定

Ray Hit Group .hitgrp 🏷️
Ray Hit Group (ヒット点グループ名) — Create Point Group = On 時に生成されるポイントグループの名前を指定
– 後段の Delete SOPGroup SOP でこのグループ名を参照し、ヒットしたポイントのみを残す・色付けする等の処理が可能


実践アイデア 💡

Example 1: 地形にメッシュを吸着 🗺️

Grid SOP (細かい平面) → Ray SOP (Method=Minimum Distance, 入力 2 に地形メッシュ) → Facet SOP (Consolidate Points + Cusp) → Out SOP

細かい解像度の Grid SOP を地形メッシュの上にシュリンクラップして、低ポリ地形からハイディテール地形を派生させる定番フロー。Minimum Distance モードは法線情報を使わずに最近接点に吸着するため、平面メッシュをそのまま地形の凹凸に貼り付けられます。

  1. Grid SOP を作成 (Rows = 64, Columns = 64) し、Ray SOP の 1 番目の入力に接続
  2. 地形となるメッシュ (任意の SOP) を Ray SOP の 2 番目の入力に接続
  3. Ray SOP の MethodMinimum Distance に設定、Transform Points を有効化
  4. Geometry Viewer で Grid が地形の表面に吸着していることを確認し、後段で Facet SOP を入れて法線を Consolidate / Cusp で整える

Example 2: 法線方向にスタンプ投影 🪧

Text SOP (ロゴ文字) → Transform SOP (位置調整) → Ray SOP (Method=Project Rays, 入力 2 にターゲット形状) → Material SOP → Out SOP

Project Rays モードを使うと、入力ポイントを自身の法線方向に飛ばして衝突面に着地させられます。テキストや装飾ジオメトリを 3D モデルの曲面に「スタンプ」のように貼り付ける用途で、ロゴの曲面マッピング・パッケージデザインのモックアップに有効。

  1. Text SOP でロゴ文字列を生成し、Transform SOP で投影したい位置・向きへ移動
  2. Ray SOP の入力 1 にロゴ、入力 2 にターゲット形状 (球・キャラクター頭部など) を接続
  3. MethodProject RaysPoint Intersection NormalCollision Normal に設定
  4. Lift パラメータに微小な値 (0.001 程度) を入れて Z-fighting を回避
  5. 後段に Material SOP で別マテリアルを割り当てると、表面のステッカーらしい仕上がりになる

Example 3: 反射バウンスで光跡点群 ✨

Sphere SOP (発射元) → Ray SOP (Method=Project Rays, Bounces=3, Save Bounce Geometry=On, 入力 2 に閉じた室内形状) → Add SOP (点を line 化) → Material SOP

Bounces を増やすと、レイが衝突面で反射しながら次の面へと進む経路を辿れます。Save Bounce Geometry を有効にすると各バウンス段階のジオメトリが保存されるため、光のパスを可視化したり、ミラーボール状の反射点群を作る用途に応用できます。

  1. Sphere SOP で発射元の点群を生成 (法線が外向きになっていることを確認)
  2. 閉じた室内形状 (Box SOP を裏返した立方体や、複雑な内側メッシュ) を Ray SOP の入力 2 に接続
  3. Method = Project RaysBounces = 3Save Bounce Geometry = OnPoint Intersection Normal = Reflected Ray に設定
  4. 出力されたバウンス済み点群を Add SOP で連結して line にすると、レイの経路が可視化される

関連オペレータ 🔗

類似機能OP 🔍

  • Project SOP — 曲線を曲面に投影する SOP。Ray と違いポイントではなく Bezier 曲線が投影対象になる
  • Creep SOP — ジオメトリを別の曲面に貼り付け・這わせる SOP。Ray の Minimum Distance に近い吸着用途で使われる

組み合わせ推奨OP 🔄

  • Point SOP — Ray が書き込んだ $DIST 距離属性や法線を参照し、ポイントの色・大きさ・位置を距離駆動でコントロール
  • Facet SOP — シュリンクラップ後のメッシュに対し Consolidate Points / Cusp / Orient Polygons をかけて陰影品質を整える後段の定番
  • Convert SOP — 入力 2 が NURBS / Bezier の場合に polygon 化する前処理。Ray は polygon メッシュを衝突面として前提とするため必須となることがある
  • Transform SOP — 入力 1・入力 2 の位置・回転を投影前に調整し、想定通りの衝突位置を作る
  • Delete SOPCreate Point Group で生成したヒット点グループを参照し、衝突しなかった残骸ポイントを除外する後処理

前処理・後処理SOP 🎯


Info CHOP情報 📊

Ray 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 — プロセス開始以降に Ray SOP がクックされた累計回数。リアルタイムに衝突計算を再実行している場合のクック頻度を確認
  • cook_time: cook_time — 直近のクック所要時間 (ミリ秒)。入力 2 のポリゴン数や Sample 値が大きいと急増するため、ボトルネック検出指標
  • cook_frame: cook_frame — Ray SOP が最後にクックされたフレーム番号。期待通りにクックが走っているかの確認に使う

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

よくある問題と解決策 🔧

❌ Problem: 投影しても入力ポイントが移動せず、元の位置のまま
✅ Solution:

  • Transform Points が有効になっているか確認。OFF だと位置は更新されず、法線・距離属性だけが書き込まれる
  • Method = Project Rays の場合、入力 1 のポイントが法線を持っているかを Info CHOP で確認。法線が (0,0,0) だとレイ方向が定まらず衝突しない
  • Scale パラメータが 0 になっていないか確認 (0 では移動量がゼロになる)

❌ Problem: 投影後のメッシュの陰影 (シェーディング) が乱れる・面が割れて見える
✅ Solution:

  • 後段に Facet SOP を入れて Consolidate Points / Orient Polygons / Cusp を順に有効化するのが定石。シュリンクラップ後の法線を再計算することで陰影が回復する
  • Point Intersection NormalCollision Normal にして衝突面の法線を取り込むと、シェーディングが衝突面と整合するようになる
  • 入力 2 が NURBS / Bezier の場合は前段に Convert SOP を入れて polygon に変換しないと、衝突計算が不安定になる場合がある

❌ Problem: 一部のポイントが衝突しない・想定外の位置に飛ぶ
✅ Solution:

  • Create Point Group を有効にしてヒットしたポイントだけをグルーピングし、後段の Delete SOP で衝突しなかったポイントを除外する
  • Intersect Farthest Surface を切り替えて、最近接ではなく最遠面を狙う設定を試す (中空構造で外殻ではなく内側を取りたい場合)
  • 入力 2 の形状が入力 1 のポイントから法線方向の延長線上にあるかを Geometry Viewer で確認。離れすぎていたり、ポイントが法線の逆方向を向いていると衝突しない

❌ Problem: Sample を増やしても投影結果がソフトにならない
✅ Solution:

  • Jitter Scale0 でないか確認。Jitter が 0 だと追加サンプルレイが同じ方向に飛ぶため、Sample を増やしても摂動が生まれない
  • Seed を変えて摂動パターンを切り替え、結果の差分を確認する
  • Sample 値を 4〜16 程度まで段階的に上げ、衝突面のノイズ特性に応じて品質と負荷のバランスを取る

参考資料 📚

その他 🔗

公式リソース 📖

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