
概要 📖 – Bullet 剛体間制約 (関節・拘束)
Constraint COMPは、Bullet Solver COMP 配下の 2 つの剛体 body に point-to-point / hinge / slider の関節を設定し、Bullet 物理シミュレーションで拘束を機能させる COMPです。Actor COMP の body を 2 つ指定し、Type で関節タイプを選び、Pivot / Hinge Axis / Slider Rotation で局所座標を定義することで、ドア・ピストン・振り子・チェーンなどの機構運動を構築できます。
主な用途 🎯
- Bullet Solver COMP 配下の 2 つの剛体 (Actor COMP body) の間に関節 (Joint) を作成する拘束コンポーネント
- Type パラメータで point-to-point (ボールジョイント) / hinge (ヒンジ) / slider (スライダ) の 3 種の関節を切替
- Body to Body モードで Actor 1 Bodies と Actor 2 Bodies のペアリングを 1:1 / 1:N で柔軟に構築 (ドミノ・チェーン・梯子状の関節網)
- Pivot / Hinge Axis / Slider Rotation により関節の局所座標 (回転軸・スライド軸・支点) を 3D 空間で定義
- Limits Page の
enablelimits+ Lower/Upper Linear/Angular Limit で関節の可動範囲を制限 (ドアの開閉角度・ピストンのストローク長など)
データフロー 🔄
入力: Actor COMP (actor1 / actor2) + Body ID 文字列 + Type + Pivot / Axis
↓
Bullet 物理エンジンに制約 (Joint) として登録
↓
親 Bullet Solver COMP のシミュレーション 1 ステップごとに対象 body 間に拘束力 (関節力) が作用
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Constraint Page 📋
基本設定 / 表示 🎛️
拘束のオン/オフ・body-to-body モード・衝突許可・ビューア表示の基本パラメータ:
- Active:
active— シミュレーション中にこの拘束を有効化するかのトグル。オフにすると関節が瞬時に解除される - Body to Body:
bodytobody— オンの場合は Actor 1 Bodies と Actor 2 Bodies の body 同士をペアで拘束、オフの場合は Actor 1 Bodies の各 body を個別に拘束 (ワールド原点に固定する形)。両 Actor の body 数が等しいなら 1:1 (例:0 1 2と3 4 5なら 0-3 / 1-4 / 2-5)、Actor 1 が多い場合は余った body を個別拘束、Actor 2 が多い場合は余りは無視 - Collisions between Bodies:
collisions— body-to-body 拘束で拘束された body 同士の衝突を許可するか。オフにすると関節で繋がった body が貫通しても接触判定されない (リンク機構では通常オフにする) - Display Constraint:
dispcom— ビューア上に拘束のガイド (回転軸・スライド軸・ピボット点) を表示するかのトグル
Type (拘束の種類) .type 🔗
拘束タイプ (Type メニュー: point-to-point / hinge / slider):
- Point to Point: メニュー先頭の既定値。指定 Pivot 点で 2 body をボールジョイントで繋ぐ (全 3 軸の回転は自由、並進のみ拘束)。振り子・チェーン・吊り下げなどに使用
- Hinge:
hinge— 指定 Pivot を支点に Hinge Axis 軸まわりだけ回転可能なヒンジ拘束。ドアの蝶番・回転扉・スイングアームなどに使用。Limits Page で角度制限可 - Slider:
slider— Slider Rotation で定義した軸方向にのみ並進可能なスライダ拘束 (デフォルトでは X 軸方向)。ピストン・引出し・リニアアクチュエータなどに使用。Limits Page で並進・回転両方を制限可
Actor 1 (拘束元) 🎯
拘束元 Actor (actor1) と body ID + 関節の局所座標 (Pivot / Hinge Axis / Slider Rotation):
- Actor COMP:
actor1— 拘束する body を持つ Actor COMP へのパス参照 - Actor Bodies:
bodies1— actor1 内で拘束対象とする body ID の正規表現リスト (例:0 1 2や*)。Actor COMP が N body を持つなら ID は 0 ~ N-1。body 数は Bullet Solver CHOP で確認できる - Pivot:
pivot1 (pivot1x, pivot1y, pivot1z)— 拘束のピボット点 (関節の支点) を actor1 のローカル座標で指定 - Hinge Axis:
axis1 (axis1x, axis1y, axis1z)— Hinge タイプでヒンジ回転軸となるベクトル (通常は 0/1 の単位軸、例: Z 軸まわりなら(0, 0, 1))。actor1 ローカル座標 - Slider Rotation:
sliderrot1 (sliderrot1x, sliderrot1y, sliderrot1z)— Slider タイプでスライド軸の回転 (度)。デフォルトはスライダ軸が X 軸方向
Actor 2 (拘束先 — Body to Body 専用) 🎯
Body to Body モード専用の 2 つ目 Actor (actor2) と body ID + 局所座標:
- Actor COMP:
actor2— Body to Body モード時に actor1 と拘束する相手の Actor COMP。同一 Actor COMP を指定してその内部の body 同士を拘束することも可 - Actor Bodies:
bodies2— actor2 内の拘束対象 body ID リスト。Body to Body のペアリングは bodies1 と bodies2 の対応関係で決まる (Body to Body 項参照) - Pivot:
pivot2 (pivot2x, pivot2y, pivot2z)— actor2 側のピボット点 (関節支点) を actor2 のローカル座標で指定 - Hinge Axis:
axis2 (axis2x, axis2y, axis2z)— actor2 側のヒンジ回転軸 (Hinge タイプ時に actor1 側と整合させる必要あり) - Slider Rotation:
sliderrot2 (sliderrot2x, sliderrot2y, sliderrot2z)— actor2 側のスライダ軸回転
Limits Page 🎚️
可動範囲制限 📐
Enable Limits + Lower/Upper Linear/Angular Limit で関節の可動範囲を制限:
- Enable Limits:
enablelimits— 拘束の可動範囲制限を有効化するトグル。オフだと body は無制限に回転・並進可能 (360° 自由回転 / 任意距離スライド) - Lower Linear Limit:
lowerlinlim— スライド軸方向の並進下限。Slider タイプのみ使用 (ピストンのストローク最小位置など) - Upper Linear Limit:
upperlinlim— スライド軸方向の並進上限。Slider タイプのみ使用 (ピストンのストローク最大位置など) - Lower Angular Limit:
loweranglim— 回転軸まわりの回転角下限。Slider および Hinge タイプで使用 (ドアの最小開度など) - Upper Angular Limit:
upperanglim— 回転軸まわりの回転角上限。Slider および Hinge タイプで使用 (ドアの最大開度など)
Common Page 🔧
Parent Shortcut .parentshortcut 🔗
コンポーネント内部からこの COMP へのパスとして使えるショートカット名:
- Parent Shortcut:
parentshortcut— コンポーネント内部の任意の場所からこの COMP を参照する際のショートカット名 (parent.<name>形式で利用可能)
Global OP Shortcut .opshortcut 🌐
プロジェクト全体からこの COMP を参照するグローバル名:
- Global OP Shortcut:
opshortcut— プロジェクト内のあらゆる場所からこの COMP へのパスとして使えるグローバル名 (op.<name>形式で利用可能)
Internal OP .iop 📎
Internal OP シーケンス (コンポーネント内部 OP への名前付き参照):
- Shortcut:
iop0shortcut— コンポーネント内部の OP に対するショートカット名 - OP:
iop0op— このコンポーネント内部の対象 OP へのパス
Node View .nodeview 👁️
ノードビューア (Network エディタ上のサムネイル) に表示する内容を決定
| 項目 | 内部名 | 説明 |
|---|---|---|
| Default Viewer | .default |
コンポーネントタイプ標準のビューアを表示 |
| Operator Viewer | .opviewer |
指定した任意 OP のノードビューアを表示 |
Operator Viewer .opviewer 🖼️
Operator Viewer モード時に表示する対象 OP:
- Operator Viewer パス:
opviewer— Node View がopviewerモードのとき、そのビューア内容として表示する OP のパス
Cloning .cloning 🧬
マスター COMP の内容を複製する Cloning 設定:
- Enable Cloning:
enablecloning— Clone Master の内容を継続的に複製するかを切替 - Enable Cloning Pulse:
enablecloningpulse— その瞬間だけ Clone Master の内容を瞬時に複製 - Clone Master:
clone— 複製元となるマスターコンポーネントへのパス
Load on Demand .loadondemand ⏳
必要時のみメモリにロードする遅延ロード設定:
- Load on Demand:
loadondemand— オンの場合、このコンポーネントは実際に必要となるまでメモリにロードされない (起動時間・メモリ消費の最適化)
External .tox .externaltox 💾
外部 .tox ファイルとの連携設定:
- Enable External .tox:
enableexternaltox— 起動時に外部 .tox ファイルからロード - Enable External .tox Pulse:
enableexternaltoxpulse— 外部 .tox ファイルから即時リロード - External .tox Path:
externaltox— ディスク上の .tox ファイルへのパス - Reload Custom Parameters:
reloadcustom— コンポーネントのカスタムパラメータ値を再読み込み - Reload Built-In Parameters:
reloadbuiltin— コンポーネントの組み込みパラメータ値を再読み込み - Save Backup of External:
savebackup— .toe ファイル内に外部 .tox のバックアップコピーを保存 - Sub-Component to Load:
subcompname— .tox 内部の特定 COMP のみを取り出してロード
Relative File Path Behavior .relpath 📁
このコンポーネント内部での相対ファイルパスの解決基準
| 項目 | 内部名 | 説明 |
|---|---|---|
| Use Parent’s Behavior | .inherit |
親コンポーネントの設定を継承 |
| Relative to Project File (.toe) | .project |
.toe プロジェクトファイルからの相対パスとして解決 |
| Relative to External COMP File (.tox) | .externaltox |
外部 .tox ファイルからの相対パスとして解決 |
実践アイデア 💡
Example 1: ドアの蝶番: Hinge 拘束で開閉 🚪
Bullet Solver COMP → Actor COMP (ドア本体, Dynamic) + Actor COMP (壁, Static) → Constraint COMP (Type=hinge, Pivot=蝶番位置, Hinge Axis=(0,1,0))
Constraint COMP の最も基本的な応用例。ドア板の Actor COMP と壁の Actor COMP の間に Hinge タイプの拘束を作成し、Y 軸まわりだけ回転可能にする。Limits Page で開度を 0° ~ 90° に制限すれば、ドアらしい挙動になる。
- Bullet Solver COMP 配下に Actor COMP を 2 つ作成: ドア板 (Dynamic, 縦長 Box SOP) と壁 (Static, 大きな Box SOP)
- Solver の子として Constraint COMP を作成し、Type を
hingeに設定 - Body to Body をオン、Actor COMP (actor1) をドア、Actor COMP (actor2) を壁に設定
- Pivot (pivot1 / pivot2) をドアの蝶番位置 (ドアの端) に揃え、Hinge Axis (axis1 / axis2) を
(0, 1, 0)(Y 軸まわり) - Limits Page で Enable Limits オン、Lower Angular Limit =
0、Upper Angular Limit =1.57(90° in radians) に設定し、ドアの開度を制限
Example 2: ピストン / 引出し: Slider 拘束で直線往復 🔩
Bullet Solver COMP → Actor COMP (ピストン, Dynamic) + Actor COMP (シリンダー, Static) → Constraint COMP (Type=slider, Slider Rotation=X 軸)
Slider タイプは Slider Rotation で定義した軸方向にのみ並進可能な拘束。ピストン・引出し・リニアアクチュエータなど、直線往復運動を扱う機構に使う。Lower/Upper Linear Limit でストローク長を制限することで、現実の機械パーツに近い挙動が得られる。
- Actor COMP を 2 つ作成: ピストン本体 (Dynamic, 細長い Box SOP) とシリンダー外殻 (Static)
- Constraint COMP の Type を
slider、Body to Body をオン - Slider Rotation (sliderrot1 / sliderrot2) を
(0, 0, 0)のまま (デフォルトの X 軸方向スライド) または任意の角度 - Enable Limits オン、Lower Linear Limit =
-0.5、Upper Linear Limit =0.5でストローク 1m に制限 - Force COMP でピストン側にパルス的な力を加えるか、Feedback CHOP で velocity を上書きしてストローク動作を駆動
Example 3: 振り子チェーン: point-to-point で多関節リンク ⛓️
Bullet Solver COMP → N 個の Actor COMP (リンク bone, Dynamic) → Constraint COMP (Type=point-to-point, Body to Body, bodies1='0 1 2 ...' / bodies2='1 2 3 ...')
Point-to-Point タイプはピボット 1 点だけを共有するボールジョイント。Body to Body モードで bodies1 と bodies2 を 1 ステップずらしたインデックス列にすると、N 個のリンクを順次拘束した振り子チェーンや鎖が作れる。各リンクは全 3 軸まわりで自由回転するため、自然な揺れが生じる。
- Actor COMP を N 個作成 (例: N=10)、各 Actor を縦に並べた Box SOP として配置、Kinematic State を
Dynamic - Constraint COMP の Type を point-to-point (メニュー先頭、既定値) のまま、Body to Body オン
- actor1 と actor2 を同じ Actor COMP リスト (または親 Actor) に指定し、Actor 1 Bodies =
0 1 2 3 4 5 6 7 8、Actor 2 Bodies =1 2 3 4 5 6 7 8 9のように 1 ずらすことで隣接リンク同士を拘束 - Collisions between Bodies をオフにして隣接リンクの貫通衝突を抑制
- Pivot を各 Actor の端 (たとえば
(0, 0.5, 0)と(0, -0.5, 0)) に設定し、リンクの接合点が一致するように調整
Example 4: スイングアーム: 角度制限付き Hinge で揺り戻し 🎢
Bullet Solver COMP → Actor COMP (アーム, Dynamic) + Actor COMP (支柱, Static) → Constraint COMP (Type=hinge, Hinge Axis=Z) → Force COMP で初動付与
Hinge 拘束 + 角度制限 (Limits) を組み合わせると、振り子的なスイング動作を物理的に正確に再現できる。Lower/Upper Angular Limit で揺り戻しの範囲を強制することで、振り子時計・メトロノーム・遊具などのモデルが組める。Force COMP で初期角速度を与えるとリアルな振動が生まれる。
- Actor COMP を 2 つ作成: スイングアーム (Dynamic, 細長 Box) と固定支柱 (Static)
- Constraint COMP の Type を
hinge、Hinge Axis を Z 軸(0, 0, 1) - Enable Limits オン、Lower Angular Limit =
-1.0、Upper Angular Limit =1.0(約 ±57°) - Force COMP をシミュレーション開始時にトルク方向の力で短時間パルスし、アームに初期角速度を与える
- Bullet Solver CHOP でアームの angvelz を取得しグラフ表示すると、リミットに当たって反発する振動波形が観察できる
関連オペレータ 🔗
類似機能OP 🔍
- Force COMP — Bullet Solver 内で body に作用する別系統の効果 COMP (拘束ではなく外力)
組み合わせ推奨OP 🔄
- Bullet Solver COMP — Constraint COMP の親となる物理ソルバ。Constraint は Solver 配下に配置することで登録される
- Actor COMP — 拘束対象となる剛体 body をホストする COMP。actor1 / actor2 パラメータで参照
- Bullet Solver CHOP — 拘束された body の transform / velocity / collision を CHOP として読み出し、可視化やフィードバック制御に利用
- Force COMP — 拘束された機構に駆動力 (トルク・直線力) を加える外力 COMP
前処理・後処理COMP 🎯
- 前処理: Bullet Solver COMP、Actor COMP
- 後処理: Geometry COMP、Camera COMP
Info COMP情報 📊
Constraint COMP は Info CHOP / Info DAT による詳細情報取得に対応しています。拘束された body のシミュレーションデータは親の Bullet Solver CHOP から取得します。
COMP 固有情報 📦
num_children: コンポーネント内部の子 OP の総数num_dats: 内部 DAT の数num_chops: 内部 CHOP の数num_tops: 内部 TOP の数num_sops: 内部 SOP の数
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数cpu_memory: OP が確保している CPU メモリ使用量
Object 固有情報 📊
tx / ty / tz: Constraint COMP 自体のワールド位置 (Translate)rx / ry / rz: Constraint COMP 自体の回転 (度)
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: 拘束が効かない / body が拘束を無視して動く
✅ Solution:
- Active パラメータがオンになっているか確認
- Constraint COMP が対象 Actor COMP と同じ Bullet Solver COMP 配下に配置されているか確認 (Solver が異なると拘束は登録されない)
- Actor Bodies (bodies1 / bodies2) の正規表現が実際の body ID 範囲とマッチしているか Bullet Solver CHOP で body 数を確認
- 対象 Actor の Kinematic State が
Dynamicになっているか確認 (Staticbody は拘束されても動かない)
❌ Problem: 拘束された body 同士が貫通する / 想定外に衝突する
✅ Solution:
- Collisions between Bodies をオフにして拘束ペア間の衝突判定を抑制 (リンク機構では通常オフ)
- Display Constraint をオンにしてビューア上でピボット位置・回転軸を視覚確認
- Pivot (pivot1 / pivot2) が両 Actor の接合点で正しく一致しているか確認 — ずれていると初期位置で関節が引き伸ばされて発散する原因になる
❌ Problem: Limits が機能しない / 角度・並進制限が無視される
✅ Solution:
- Enable Limits をオンに切替
- Type と Limit の対応関係を確認: Lower/Upper Linear Limit は Slider のみ、Lower/Upper Angular Limit は Hinge と Slider で使用 (Point-to-Point では効かない)
- 角度の単位はラジアン。90° を制限したい場合は
1.57(≈ π/2) を指定
❌ Problem: Body to Body モードで想定通りのペアリングにならない
✅ Solution:
- Body to Body がオンになっているか確認 (オフだと Actor 1 Bodies の各 body が個別にワールド原点へ拘束される)
- Actor 1 Bodies と Actor 2 Bodies の文字列が同じ長さの整数列になっているか確認 (例:
0 1 2と3 4 5で 0-3 / 1-4 / 2-5) - bodies1 が bodies2 より多い場合、余りは個別拘束 (ワールド原点固定) になる仕様を意識し、意図しない動作の原因を切り分け
参考資料 📚
その他 🔗
- TouchDesigner Wiki — COMP 概要
- TouchDesigner Wiki — Category:COMPs
- TouchDesigner Wiki — Category:Components
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – Constraint COMP
- TouchDesigner公式ドキュメント – Bullet Solver COMP
- TouchDesigner公式ドキュメント – Actor COMP

