物理チェーン・ロープのセットアップ方法

物理チェーン・ロープのセットアップ方法

本ガイドでは、物理チェーン(ロープや鎖)をセットアップする方法を詳しく説明します。


目次

  1. 基本的なチェーン構造の理解
  2. 手動セットアップ
  3. 自動セットアップ(ChainJointSetupTool使用)
  4. 可視化システムの設定
  5. ジョイント監視の設定
  6. よくある設定パターン
  7. トラブルシュート

1. 基本的なチェーン構造の理解

チェーンの構成要素

チェーンは以下の要素で構成されます:

  1. RigidBody2D: チェーンの各リンク(節)
  2. GrooveJoint2D または PinJoint2D: リンク間の接続
  3. segノード: 各RigidBody2D内の接続点マーカー(Node2D)
  4. BreakableJointMonitor2D: ジョイントの破断を監視
  5. ChainPathBinder2D: チェーンの形状をPath2Dとして可視化
  6. PathRibbonMesh2D: Path2Dをリボンメッシュで描画

ノード構造の例

ChainRoot (Node2D)
├── RigidBody2D1
│   ├── CollisionShape2D
│   ├── Sprite2D
│   ├── seg1 (Node2D, position: 0, -10)
│   └── seg2 (Node2D, position: 0, 10)
├── RigidBody2D2
│   ├── GrooveJoint2D (RigidBody2D1に接続)
│   ├── CollisionShape2D
│   ├── Sprite2D
│   ├── seg1
│   └── seg2
├── RigidBody2D3
│   └── ...
└── ...

2. 手動セットアップ

2-1. 基本的なチェーンの作成

ステップ1: チェーンのルートノードを作成

  1. シーンにNode2Dを配置します(例:ChainRoot
  2. このノードがチェーンの親になります

ステップ2: RigidBody2Dを配置

  1. ChainRootの子としてRigidBody2Dを複数配置します
  2. 各RigidBody2Dに名前を付けます(例:Link1, Link2, Link3…)
  3. 各RigidBody2Dの位置を設定します(縦に並べる場合:各リンクの長さに応じて適切な間隔で配置)

ステップ3: CollisionShape2DとSprite2Dを追加

  1. 各RigidBody2Dの子としてCollisionShape2Dを追加します
  2. ShapeRectangleShape2DまたはCapsuleShape2Dを設定します
  3. 各RigidBody2Dの子としてSprite2Dを追加します(任意)
  4. テクスチャを設定します

ステップ4: segノードを作成

  1. 各RigidBody2Dの子としてNode2Dを追加します
  2. 最初のノードをseg1と命名し、position(0, -10)に設定します
  3. 2番目のノードをseg2と命名し、position(0, 10)に設定します
    • これらは接続点のマーカーです
    • seg1は上側、seg2は下側の接続点を表します

ステップ5: GrooveJoint2Dを配置

  1. 2番目以降の各RigidBody2Dの子としてGrooveJoint2Dを追加します
  2. 各GrooveJoint2Dの設定:
    • position: (0, -16)(RigidBody2Dの上端付近)
    • node_a: 前のRigidBody2Dへのパス(例:../../RigidBody2D
    • node_b: ..(自身のRigidBody2D)
    • bias: 0.9(硬い接続)または0.2(柔らかい接続)
    • length: 8.0(溝の長さ)
    • initial_offset: 1.0または2.0(初期オフセット)

ステップ6: 先頭・末尾の固定(任意)

  1. 先頭を固定する場合:

    • StaticBody2Dを配置します
    • その子としてGrooveJoint2Dを追加します
    • node_a: ..(StaticBody2D自身)
    • node_b: 先頭のRigidBody2Dへのパス(例:../../Node2D/RigidBody2D
  2. 末尾を固定する場合:

    • 同様にStaticBody2DGrooveJoint2Dを配置します

完成例

ChainRoot (Node2D)
├── RigidBody2D1
│   ├── CollisionShape2D
│   ├── Sprite2D
│   ├── seg1 (Node2D, position: 0, -10)
│   └── seg2 (Node2D, position: 0, 10)
├── RigidBody2D2
│   ├── GrooveJoint2D
│   │   ├── node_a: ../../RigidBody2D1
│   │   ├── node_b: ..
│   │   ├── position: (0, -16)
│   │   ├── bias: 0.9
│   │   ├── length: 8.0
│   │   └── initial_offset: 1.0
│   ├── CollisionShape2D
│   ├── Sprite2D
│   ├── seg1
│   └── seg2
└── ...

3. 自動セットアップ(ChainJointSetupTool使用)

3-1. 基本的な自動セットアップ

ステップ1: チェーンのルートノードを作成

  1. シーンにNode2Dを配置します(例:ChainRoot

ステップ2: RigidBody2Dを配置

  1. ChainRootの子としてRigidBody2Dを複数配置します
  2. 各RigidBody2DにCollisionShape2DSprite2Dを追加します
  3. 位置を適切に設定します

ステップ3: ChainJointSetupToolを配置

  1. ChainRootの親ノード(または任意の場所)にNodeを配置します
  2. chain_setup_tool.gdをアタッチします
  3. Inspectorで以下を設定します:
    • target_parent: ChainRootへのNodePath
    • joint_type: GROOVE(推奨)またはPIN
    • auto_create_seg_nodes: true(segノードを自動生成)
    • auto_setup_all: true(全システムを自動セットアップ)

ステップ4: セットアップを実行

  1. Inspectorで_setup_buttonにチェックを入れます
  2. または、スクリプトからsetup_chain()を呼び出します
  3. エディタでは自動的に実行されます

自動生成されるもの

  • auto_setup_all=trueの場合:
    • 各RigidBody2Dにseg1seg2ノードが生成されます
    • 各RigidBody2DにGrooveJoint2D(またはPinJoint2D)が生成されます
    • BreakableJointMonitor2Dが生成されます
    • ChainPathBinder2Dが生成されます
    • Path2Dが生成されます
    • PathRibbonMesh2Dが生成されます

3-2. 詳細設定

GrooveJoint2Dの設定

プロパティ 説明 推奨値
groove_length 溝の長さ 8.0
groove_initial_offset 初期オフセット 1.0 または 2.0
groove_joint_position_local ジョイントの位置 (0, -16)
bias 接続の硬さ 0.9(硬い)または 0.2(柔らかい)
disable_collision 衝突無効化 false(通常は有効)

segノードの設定

プロパティ 説明 推奨値
auto_create_seg_nodes segノードを自動生成 true
seg_node_prefix segノードのプレフィックス “seg”
seg1_position_local seg1の位置 (0, -10)
seg2_position_local seg2の位置 (0, 10)

自動セットアップの設定

プロパティ 説明 推奨値
auto_setup_all 全システムを自動セットアップ true
auto_connect_breakable_monitor BreakableJointMonitor2Dに自動接続 true
auto_setup_chain_binder ChainPathBinder2Dに自動設定 true
setup_on_ready 実行時に自動セットアップ false(通常は手動実行)

4. 可視化システムの設定

4-1. ChainPathBinder2Dの設定

ステップ1: ChainPathBinder2Dを配置

  1. チェーンのルートノード(またはその親)にNodeを配置します
  2. chain_path_binder.gdをアタッチします

ステップ2: 基本設定

  1. auto_detect_mode: trueに設定(自動検出モード)
  2. search_root: チェーンのルートノードへのNodePath(例:../ChainRoot
  3. output_paths: Path2DへのNodePathを追加(空なら自動生成)

ステップ3: オプション設定

プロパティ 説明 推奨値
auto_update 自動更新 true
update_in_physics 物理フレームで更新 true
enable_smooth_handles Curve2Dを滑らかにする true
smooth_handle_strength_px ハンドルの強さ 2.0~12.0
resample_spacing_px 点列を固定間隔でリサンプル 0.0(無効)または 8.0

4-2. PathRibbonMesh2Dの設定

ステップ1: PathRibbonMesh2Dを配置

  1. チェーンのルートノード(またはその親)にNode2Dを配置します
  2. path_ribbon_mesh_2d.gdをアタッチします

ステップ2: 基本設定

  1. path_nodes: Path2DへのNodePathを追加(例:[NodePath("../Path2D")]
  2. width: リボンの幅(例:20.0
  3. ribbon_texture: テクスチャを設定(例:chain.pngrope.png

ステップ3: オプション設定

プロパティ 説明 推奨値
width_curve 幅のカーブ Curveリソース
upper_width_curve 上側の幅カーブ Curveリソース
lower_width_curve 下側の幅カーブ Curveリソース
thickness_domain_mode 厚みのドメインモード 0(通常)

4-3. Path2Dの作成

自動生成の場合

  • ChainPathBinder2Doutput_pathsが空の場合、自動でPath2Dが生成されます

手動作成の場合

  1. チェーンのルートノード(またはその親)にPath2Dを配置します
  2. Curve2Dが自動で作成されます
  3. ChainPathBinder2Doutput_pathsに追加します

5. ジョイント監視の設定

5-1. BreakableJointMonitor2Dの設定

ステップ1: BreakableJointMonitor2Dを配置

  1. チェーンのルートノード(またはその親)にNodeを配置します
  2. breakable_joint_monitor_2d.gdをアタッチします

ステップ2: 基本設定

  1. search_root: 監視対象のルートノードへのNodePath(例:../ChainRoot
  2. auto_collect_on_ready: true(起動時に自動収集)

ステップ3: 破断条件の設定

プロパティ 説明 推奨値
break_relative_speed 相対速度がこの値以上で破断 0.0(無効)または 500.0
break_angle_degrees この角度以上で一定時間経ったら破断 0.0(無効)または 80.0
break_angle_duration_sec 角度超過がこの秒数以上続いたら破断 0.5
break_stretch_ratio 初期距離に対する伸び率がこの値以上で破断 0.0(無効)または 1.5
use_break_delay_frames BreakDelayをフレーム数で扱う true
break_delay_frames exceededがこのフレーム数連続したら破断 1~10

5-2. 個別設定(JointBreakParams)

ステップ1: JointBreakParamsリソースを作成

  1. プロジェクトパネルで右クリック → 新規リソース
  2. JointBreakParamsを選択
  3. 名前を付けて保存(例:joint_params_weak.tres

ステップ2: 個別設定を記入

  1. joint_path: 対象ジョイントへのNodePath(例:../ChainRoot/RigidBody2D2/GrooveJoint2D
  2. 個別の破断パラメータを設定:
    • -1.0ならグローバル設定を使用
    • 0.0以上なら個別設定を使用

ステップ3: BreakableJointMonitor2Dに追加

  1. BreakableJointMonitor2Djoint_paramsに作成したリソースを追加します

BreakableJointMonitor2D
├── search_root: ../ChainRoot
├── break_angle_degrees: 80.0(グローバル設定)
└── joint_params:
    └── JointBreakParams
        ├── joint_path: ../ChainRoot/RigidBody2D2/GrooveJoint2D
        └── groove_break_angle_degrees: 90.0(個別設定、より敏感)

6. よくある設定パターン

パターン1: 柔らかいロープ

GrooveJoint2Dの設定

  • bias: 0.2(柔らかい)
  • length: 8.0
  • initial_offset: 2.0

RigidBody2Dの設定

  • linear_damp: 10.0(減衰が強い)
  • angular_damp: 10.0

BreakableJointMonitor2Dの設定

  • break_angle_degrees: 80.0
  • break_angle_duration_sec: 0.3(短い時間で切断)

用途: 柔らかく揺れるロープ、比較的簡単に切れる


パターン2: 硬いチェーン

GrooveJoint2Dの設定

  • bias: 0.9(硬い)
  • length: 8.0
  • initial_offset: 1.0

RigidBody2Dの設定

  • mass: 3.0(通常のリンク)
  • mass: 8.0(重い部分、例:ボールや重り)

BreakableJointMonitor2Dの設定

  • break_angle_degrees: 0.0(無効、切れない)
  • または個別設定で一部のみ切断可能

用途: 硬いチェーン、ほとんど切れない、重い物体を吊るす


パターン3: 固定チェーン

先頭の固定

  • StaticBody2Dを配置
  • GrooveJoint2Dで先頭のRigidBody2Dに接続

末尾の固定

  • StaticBody2Dを配置
  • GrooveJoint2Dで末尾のRigidBody2Dに接続

用途: 橋の鎖、固定されたロープ


パターン4: 分岐チェーン

構造

  • 複数のチェーンを1つのRigidBody2Dで連結
  • 連結点のRigidBody2Dに複数のGrooveJoint2Dを配置

Chain1
└── RigidBody2D6
    └── GrooveJoint2D (Chain1内)
    └── GrooveJoint2D2 (Chain2/RigidBody2D7に接続)

用途: 複数のチェーンを連結、Y字型のロープ


7. トラブルシュート

問題1: チェーンが動かない

原因と対処

原因 対処
RigidBody2Dがfreeze=true freeze=falseに設定
RigidBody2Dのmassが0 massを1.0以上に設定
GrooveJoint2Dのnode_aが正しくない NodePathを確認、相対パスを修正
GrooveJoint2Dのnode_bが正しくない node_b..に設定

問題2: チェーンが切れすぎる

原因と対処

原因 対処
break_angle_degreesが小さすぎる 値を大きくする(例:80.0 → 120.0)
break_delay_framesが小さすぎる 値を大きくする(例:1 → 10)
break_relative_speedが小さすぎる 値を大きくする、または0.0(無効)に設定
biasが小さすぎる(柔らかすぎる) 値を大きくする(例:0.2 → 0.9)

問題3: チェーンが切れない

原因と対処

原因 対処
破断条件がすべて0.0(無効) break_angle_degreesなどを有効な値に設定
BreakableJointMonitor2Dsearch_rootが正しくない 正しいNodePathに設定
ジョイントがexclude_groupsに含まれている exclude_groupsを確認
auto_collect_on_ready=false trueに設定、またはcollect_joints()を手動で呼ぶ

問題4: パスが表示されない

原因と対処

原因 対処
ChainPathBinder2Dauto_update=false trueに設定
output_pathsが空 Path2Dを追加、または自動生成を待つ
search_rootが正しくない 正しいNodePathに設定
segノードが存在しない auto_create_seg_nodes=true、または手動でsegノードを作成
auto_detect_mode=falsechain_partsが空 auto_detect_mode=true、またはchain_partsChainPartResourceを追加

問題5: セットアップツールが動作しない

原因と対処

原因 対処
target_parent配下にRigidBody2Dが2つ未満 2つ以上のRigidBody2Dを配置
target_parentが未設定で親ノードもない target_parentを明示的に設定
エディタで実行していない エディタで_setup_buttonにチェックを入れる
既存のJointが削除されていない 手動で既存のJointを削除してから再実行

問題6: チェーンが重すぎる(パフォーマンス)

原因と対処

原因 対処
RigidBody2Dの数が多すぎる リンク数を減らす
continuous_cdが大きすぎる continuous_cdを0または1に設定
PathRibbonMesh2Dの更新が重い auto_update=falseにして手動更新、または更新頻度を下げる
BreakableJointMonitor2Dが毎フレーム再収集している recollect_every_frame=falseに設定

8. セットアップチェックリスト

基本的なチェーン

  • Node2Dをルートとして配置
  • 2つ以上のRigidBody2Dを配置
  • 各RigidBody2DにCollisionShape2Dを追加
  • 各RigidBody2Dにseg1seg2ノードを追加
  • 2番目以降のRigidBody2DにGrooveJoint2Dを追加
  • 各GrooveJoint2Dのnode_anode_bを正しく設定

可視化システム

  • ChainPathBinder2Dを配置
  • auto_detect_mode=trueに設定
  • search_rootを設定
  • Path2Dを作成(または自動生成を待つ)
  • PathRibbonMesh2Dを配置
  • path_nodesPath2Dを設定
  • テクスチャを設定

ジョイント監視

  • BreakableJointMonitor2Dを配置
  • search_rootを設定
  • 破断条件を設定(例:break_angle_degrees
  • auto_collect_on_ready=trueに設定

自動セットアップ(ChainJointSetupTool使用)

  • ChainJointSetupToolを配置
  • target_parentを設定
  • auto_setup_all=trueに設定
  • _setup_buttonにチェックを入れる、またはsetup_chain()を呼ぶ

9. 実例:柔らかいロープの作成

ステップ1: ルートノードの作成

  1. シーンに適切なルートノードを配置(例:Area2DNode2Dなど)
  2. その子としてチェーン用のNode2Dを配置

ステップ2: RigidBody2Dの配置

  1. チェーン用Node2Dの子として必要な数のRigidBody2Dを配置

  2. 各RigidBody2Dの位置を設定:

    • 縦に並べる場合:各リンクの長さに応じて適切な間隔で配置
    • 横に並べる場合:position.xを調整
    • リンク間の間隔は、各リンクのサイズと接続方法に応じて決定
  3. 各RigidBody2Dに設定:

    • linear_damp: 10.0(減衰が強い)
    • angular_damp: 10.0

ステップ3: CollisionShape2Dとsegノード

  1. 各RigidBody2DにCollisionShape2Dを追加
  2. 形状は用途に応じて選択(RectangleShape2DCapsuleShape2Dなど)
  3. 各RigidBody2Dにseg1position: 0, -10)とseg2position: 0, 10)を追加

ステップ4: GrooveJoint2Dの配置

  1. 2番目以降の各RigidBody2Dの子としてGrooveJoint2Dを追加:
    • position: (0, -16)(RigidBody2Dの上端付近)
    • node_a: 前のRigidBody2Dへの相対パス
    • node_b: ..(自身のRigidBody2D)
    • bias: 0.2(柔らかい接続)
    • length: 8.0
    • initial_offset: 2.0

ステップ5: 固定用StaticBody2D(任意)

  1. 先頭を固定する場合:ルートノードの子としてStaticBody2Dを配置

  2. その子としてGrooveJoint2Dを追加:

    • node_a: ..(StaticBody2D自身)
    • node_b: 先頭のRigidBody2Dへの相対パス
    • bias: 0.2
    • length: 8.0
    • initial_offset: 2.0
  3. 末尾を固定する場合も同様に設定

ステップ6: 可視化システム

  1. ルートノードの子としてPath2Dを配置

  2. ルートノードの子としてNodeを配置し、chain_path_binder.gdをアタッチ:

    • auto_detect_mode: true
    • search_root: チェーン用Node2Dへの相対パス
    • output_paths: Path2Dへの相対パス
    • enable_smooth_handles: true
    • smooth_handle_strength_px: 2.0
  3. ルートノードの子としてNode2Dを配置し、path_ribbon_mesh_2d.gdをアタッチ:

    • path_nodes: Path2Dへの相対パス
    • width: 20.0
    • ribbon_texture: 適切なテクスチャを設定

ステップ7: ジョイント監視

  1. ルートノードの子としてNodeを配置し、breakable_joint_monitor_2d.gdをアタッチ:

    • search_root: チェーン用Node2Dへの相対パス
    • break_angle_degrees: 80.0
    • break_angle_duration_sec: 0.3
    • use_break_delay_frames: false
    • break_delay_frames: 3
  2. ChainPathBinder2Djoint_monitorに設定(任意)


10. 実例:硬いチェーンと重りの作成

ステップ1: チェーンの作成

  1. シーンに適切なルートノードを配置
  2. その子としてチェーン用のNode2Dを配置

ステップ2: RigidBody2Dの配置

  1. チェーン用Node2Dの子として必要な数のRigidBody2Dを配置

  2. 各RigidBody2Dの位置を設定:

    • 縦に並べる場合:各リンクの長さに応じて適切な間隔で配置
    • 先頭のRigidBody2Dはfreeze: trueに設定することも可能(固定)
  3. 重りとなるRigidBody2Dにはmassを大きく設定(例:mass: 8.0

  4. 各RigidBody2Dにseg1seg2を追加

ステップ3: GrooveJoint2Dの配置

  1. 2番目以降の各RigidBody2Dの子としてGrooveJoint2Dを追加:
    • position: (0, -16)
    • node_a: 前のRigidBody2Dへの相対パス
    • node_b: ..
    • bias: 0.9(硬い接続)
    • length: 8.0
    • initial_offset: 1.0

ステップ4: 可視化システム

  1. チェーン用Node2Dの子としてPath2Dを配置
  2. チェーン用Node2Dの子としてNodeを配置し、chain_path_binder.gdをアタッチ
  3. チェーン用Node2Dの子としてNode2Dを配置し、path_ribbon_mesh_2d.gdをアタッチ(適切なテクスチャを設定)

ステップ5: ジョイント監視(個別設定あり)

  1. チェーン用Node2Dの子としてNodeを配置し、breakable_joint_monitor_2d.gdをアタッチ
  2. 必要に応じてJointBreakParamsリソースを作成:
    • joint_path: 対象ジョイントへの相対パス
    • groove_break_angle_degrees: 90.0(個別設定)
    • groove_break_angle_duration_sec: 0.5
  3. BreakableJointMonitor2Djoint_paramsに追加

ステップ6: 分岐チェーンの作成(任意)

  1. 別のチェーン用Node2Dを配置
  2. 同様に必要な数のRigidBody2Dを配置
  3. 連結点のRigidBody2Dに2つのGrooveJoint2Dを追加:
    • 1つ目:自身のチェーン内の接続
    • 2つ目:別のチェーンのRigidBody2Dに接続

以上が、チェーンのセットアップガイドです。

「いいね!」 1