物理エンジン 2.0

物理学の動作をオブジェクトに追加して、物理学の法則に従ってオブジェクトを現実的な方法で移動させることができます。バックグラウンドで、拡張機能は、高速で非常に完全な剛体物理シミュレーションライブラリであるBox2Dを使用します。


動作は3つの大きな概念で構成されています。ボディを含むワールド、ボディ、およびボディをリンクするジョイントです。これらはすべて、この資料で詳しく説明されています。

制限があります:上記のように、拡張機能は剛体の物理をシミュレートします。つまり、ボディは変形できません。柔らかい形状、衣服、液体などはサポートされていません。.

ワールド

ワールドは、シミュレーションが実行され、ボディとジョイントがワールドにアタッチされ、他のエンティティと相互作用できる場所です。
ワールドにオブジェクトを配置する必要はありません。物理ビヘイビアを使用するオブジェクトは、ワールドに自動的に追加されます。また、ワールドは一度に1つしか存在できません。2つの独立したシミュレーションを同時に実行することはできません。
GDevelopのシーンサイズと同様に、ワールドサイズは無限であるため、オブジェクトの場所を気にする必要はなく、常に物理法則に従います。

ワールドには3つのプロパティがあります。

  • 重力 2つのコンポーネント(XおよびY)で構成され、重力のように機能し、すべてのオブジェクトに力を加えて、それらを指定された方向に押します。オブジェクトは重力スケール係数もサポートします。これについては、ボディセクションでさらに詳しく説明します。
  • タイムスケール シミュレーションが使用する時間のスケールを定義します。タイムスケール= 0.5の場合、シミュレーションは半分の速度で実行され、タイムスケール= 2の場合、シミュレーションは2倍の速度で実行され、タイムスケール= 0の場合、シミュレーションは一時停止します。弾丸の時間効果に非常に便利です!
  • スケール(拡大縮小) GDevelopの距離とサイズはピクセル単位で定義されますが、物理エンジンはメートルを使用するため、スケールファクター(拡大率)を設定する必要があります(さらに、スケールXとYの2つのコンポーネントがあります)。スケール番号は、1メートルが何ピクセルかを意味します。たとえば、50のスケールは、GDevelopの50ピクセルの距離が物理世界で1メートルに変換されることを意味します。
ワールドスケールを決定するためのルール1は、可動オブジェクト/ダイナミクスオブジェクトのサイズが0.1〜10メートルの範囲になるように選択することです。この範囲外では、シミュレーションの精度が失われます。たとえば、100 x 100ピクセル程度のオブジェクトサイズで作業する場合、100のワールドスケールは完璧です。これにより、体のサイズが約1 x 1メートルになります。静的オブジェクトははるかに長く、最大50メートルまで拡大できます。

ボディ

ボディは物理動作エクステンションの生命体のようなものであり、オブジェクトがどのように動くか、その形状は何になるか、どれだけ跳ね返るか、回転または動くことができるかを定義します。

物理動作をオブジェクトに追加すると、設定画面から直接ボディ構成を設定できます。 いろいろなオプションがありますので、以下に分類します。 .

ボディ・タイプ

GDevelopは3つの基本的なボディタイプをサポートしています。

  • ダイナミック 最も一般的なタイプであるダイナミック(動的)ボディは重力の影響を受け、他の動的ボディ、静的ボディ、および運動学的ボディと衝突する可能性があります。それらに力と衝撃を加え、速度も変更できます。移動しなければならないものはほとんど、動的なボディでなければなりません
  • スタティック スタティック(静的)オブジェクトは重力の影響を受けず、力、衝撃、速度の変更を使用してオブジェクトを移動することはできません。キネマテチックやその他の静的ボディを無視して、ダイナミクスオブジェクトのみと衝突できます。それらは、地面、動かない壁、プラットフォームなど、静的な世界のジオメトリに使用することを意図しています。
  • キネマチック キネマティックは非常に特殊です。静的オブジェクトは重力や力や衝撃の影響を受けませんが、ダイナミクスと同様に、速度で移動できます。キネマティクは動的オブジェクトとのみ衝突し、移動可能な壁とプラットフォームをシミュレートするのに役立ちます。

そして、いくつかの動的関連の設定:

  • 弾丸 trueに設定すると、オブジェクトは継続的衝突検出アルゴリズムを使用して、パフォーマンスをわずかに低下させますが、非常に高速で移動するときの応答を改善します。弾丸(または非常に高速なオブジェクト)を正しくシミュレートするのに役立ち、弾丸が細いオブジェクトを通過する可能性を減らします。
本当に必要なオブジェクトでこのオプションを使用します。移動するすべてのオブジェクトで使用した場合のパフォーマンスへの影響はわずかではありません
  • 回転固定 trueに設定すると、オブジェクトは回転できなくなります。プレーヤーが壁に衝突するたびに、または斜面を歩いている間、プレーヤーが回転することを想像してください。
  • スリープ可能 trueに設定されている場合、エンジンは、スリープ状態になってしばらく動かなかったオブジェクトのパフォーマンスを改善できます。これは単なるパフォーマンス設定であり、シミュレーション自体には影響しません。
イベント条件を使用して、ボディがスリープしているかどうかを確認できます。オブジェクトがスリープしている場合、それはしばらく平衡状態にあったことを意味し、バランスゲームを作成するのに役立ちます。

ボディ・シェイプ

ボディ・シェイプオプションはボディの形状とサイズを決定します。形のに応じて、寸法を設定するためのさまざまなオプションがあります。

  • ボックス(四角形) オブジェクトを中心とした軸に沿った長方形。カスタムの幅と高さが設定されていない場合、オブジェクトのサイズが使用されます。
  • サークル(円) オブジェクトを中心とする円。カスタム半径が設定されていない場合、オブジェクトの幅と高さから平均として計算されます。オブジェクトが正方形の場合、結果はオブジェクトの境界ボックス内に内接する円になります。
  • エッジ オブジェクトの中心にある細い線。このシェイプにはボリュームがないため、動的なボディとしてはうまく機能せず、地面やプラットフォームとして静的なジオメトリに使用することを意図しています。カスタムの長さと角度が設定されていない場合、エッジはオブジェクトの幅に等しい長さの水平線になります。
  • ポリゴン 頂点に沿った独自の形。多角形は凸である必要があり、この条件が満たされない場合、形状はデフォルトのボックスにフォールバックします。頂点の数は、3以上(凸状にすることはできません)、8以下(ポリゴンごとにサポートされる頂点の最大数)以下でなければなりません: 3 ≤ 頂点の数 ≤ 8 。

カスタムシェイプタイプと寸法に加えて、ボディシェイプは2つの追加オプションをサポートしています。

  • オフセット オフセットには2つの要素(XおよびY)があり、オブジェクトの中心から形状を移動するために使用できます。
  • スケール(拡大縮小) シェイプも拡大縮小できます。シェイプのカスタム寸法とオフセットをスケーリングします。たとえば、ボックスシェイプを使用し、幅と高さをオブジェクトの元のサイズと等しくするなど、カスタム寸法を使用しない場合、スケーリングが自動的に行われるため、シェイプスケールを変更する必要はありません。シェイプタイプがポリゴンの場合、スケールは頂点の位置も変更し、拡大縮小はポリゴンの中心に原点をに設定します。シェイプを縮小すると、頂点はオブジェクトの中心に向かって縮小されます。

ボディの設定

物理ボディには、タイプと形状に加えて、衝突時のボディの動作、重力によるボディへの影響、および空気摩擦によって失われるエネルギーを決定する追加の設定があります。各設定について以下に説明します。

  • 密度 密度は重さを決定します。一般的な公式はdensity = mass/volumeですが、3次元の奥行きが無いいため、安全にそれをdensity = mass/areaと仮定できます。同じ密度であるが面積/サイズが異なる2つのボディの質量は異なるため、オブジェクトのサイズを変更するときは密度を考慮する必要があります。
    密度は負の数字にはなりません!
  • 摩擦 摩擦は、接触している物体に、移動方向と反対の方向に力を加えます。摩擦が大きいほど、オブジェクトは接触時の速度が低下します。理解を深めるために、砂で作られたプラットフォームの摩擦は1(非常に高い)に近く、氷で作られたプラットフォームの摩擦係数は0に近くなります。

    摩擦は負の数字にはなりません!

2つのオブジェクトが接触している場合、摩擦の量は、friction = sqrt(frictionA * frictionB)の式を通して衝突するオブジェクトの摩擦係数を使用して計算されます。

  • 復元 オブジェクトが各衝突で保持または失うエネルギーの量を決定します。ゼロの値は、衝突が完全に非弾性であり、オブジェクトがまったく跳ね返らないことを意味します。反発= 1の場合、衝突は完全に弾性的であり、オブジェクトは毎回同じエネルギーで跳ね返ります。ボールが地面から跳ね返り、常に同じ高さに達すると想像してください。復元の値が1より大きい場合は有効ですが、衝突のたびにオブジェクトにエネルギーが与えられ、シミュレーションはおそらく制御不能になります。

    復元は負の数値にはなりません!

2つのオブジェクトが接触した場合、反発の量は、restitution = max(restitutionA, restitutionB)の式を通じて衝突するオブジェクトの反発を使用して計算されます。

  • 線形減衰 リニアダンピング(線形減衰)は、常にオブジェクトの速度を低下させます。値が大きいほど、オブジェクトの速度が低下します。空気粘度として想像できます。非常に高い値は、液体内を移動するオブジェクトをシミュレートします。

    任意の値を使用できますが、負の減衰により、各ステップでオブジェクトが速度を獲得し、非物理的な動作が生成されます。

  • 角度減衰 線形減衰に似ていますが、オブジェクトの線形速度を遅くする代わりに、角速度を遅くし、オブジェクトを各ステップでゆっくり回転させます。

任意の値を使用できますが、負の減衰により、各ステップでオブジェクトが角速度を獲得し、非物理的な動作が生成されます。

  • 重力スケール この係数にワールドの重力を掛けて、オブジェクトに適用される重力を決定します。これはベクトルではなく数値であることに注意してください。重力の向きは変更できず、大きさと感覚だけを変更できます。任意の数値が有効です。いくつかの例:重力スケールが1の場合、適用される重力は世界の重力になります。2の場合、このオブジェクトの重力は2倍になり、0.5の場合、重力は2倍になります。 0の場合、オブジェクトは重力の影響を受けません。-1の場合、重力は反転します。
    負の重力スケールを使用して、特定のオブジェクトの重力を反転できます。

レイヤーとマスク

レイヤーとマスクは、オブジェクト間の衝突をフィルタリングする方法です。あなたがゾンビのゲームを構築していて、プレイヤーを地面と衝突させ、ゾンビもプレイヤーと地面と衝突させたいが、ゾンビを他のゾンビと衝突させたくないと想像してくださいこのような場合、衝突フィルターが必要です。

フィルターはどのように機能しますか? ルールは1つだけです。

AのレイヤーがBのマスクに一致し、BのレイヤーがAのマスクに一致する場合、2つのオブジェクトAとBが衝突する可能性があります

上記のゾンビ問題の可能な解決策は次のとおりです。

  • 地面: 最初のレイヤーと最初と2番目のマスクを有効にします。
  • プレイヤー: 最初のレイヤーと最初と2番目のマスクを有効にします。
  • ゾンビ: 2番目のレイヤーと最初のマスクのみを有効にします

なぜ機能するのですか?

  • 地面とプレイヤー: 地面のレイヤーはプレーヤーマスク(最初)と一致し、プレイヤーレイヤーはグラウンドマスク(最初)と一致します。
  • 地面とゾンビ: グラウンドレイヤーはゾンビマスク(最初)と一致し、ゾンビレイヤーはグラウンドマスクと一致(2番目)します。
  • プレイヤーとゾンビ: プレイヤーレイヤーはゾンビマスク(最初)と一致し、ゾンビレイヤーはプレイヤーマスク(2番目)と一致します
  • ゾンビとゾンビ: ゾンビでは、2番目のレイヤーのみが有効になり、最初のマスクのみが有効になるため、ゾンビは互いに衝突できません。

16のレイヤーと16のマスクを使用できることに注意してください。この小さな問題を解決するには、2つのレイヤーとマスクだけが必要でした。

動作

オブジェクトを設定したら、シミュレーションを開始します。重力が物を押し始め、オブジェクトが動き、衝突しますが、ゲームとはまったくやり取りできません。自分でオブジェクトを移動し、イベントシステムを使用する必要があります。オブジェクトとやり取りし、希望する方法でオブジェクトを移動するための便利なアクションを次に示します。

GDevelopのビルトインフォースは、物理学の動作には適していません。線形速度を設定し、物理学または物理学アクションに固有のフォースを使用します。
  • フォース: フォースはオブジェクトの動きを変更し、かなりの効果を生成するためにしばらくの間使用されることを意図しています。オブジェクトに力を加えたときにオブジェクトが得る速度は、力の大きさとオブジェクトの質量に依存します。同じ力が両方の質量に適用される場合、重いオブジェクトは軽いオブジェクトよりも遅く動きます。

    フォースを追加するには、アプリケーションポイントを設定する必要があります。.

  • トルク: フォースだけでなく回転力が加わります。トルクはオブジェクトに角加速度を生成し、時間に沿ってオブジェクトを高速または低速で回転させます。
  • インパルス: フォースに似ていますが、時間ステップに依存せず、代わりに「量」の速度を即座に追加します。一度だけ使用することを意図しています。一般的な使用法は、ジャンプをシミュレートすることです。ジャンプボタンを押すたびに、上向きのインパルスが追加されます。

    インパルスを追加するには、アプリケーションポイントを設定する必要があります。.

  • 角度インパルス: インパルスに加えて回転力を追加します。 オブジェクトの回転速度を即座に変更します。
  • 速度: オブジェクトの速度を直接変更できます。たとえば、キャラクターを一定の速度で歩行させ、移動ボタンを押しながら速度を変更できます。
  • 角速度: 角速度(回転速度)も直接設定できます
オブジェクトの位置を直接変更できますが、少なくとも新しい位置が修正されるまで、非物理的な動作が生成されます。結局のところ、オブジェクトは実生活ではテレポートしないですよね。

力と衝動にはアプリケーションポイントが必要であることに注意してください。下端からガラスを押す(ガラスを動かす)ことは、ガラスを上端から押す(ガラスが落ちる可能性が高い)ことやドアを押すことと同じではないため重要です。ヒンジからよりもノブから押しますよね。
適用点がオブジェクトの質量中心と異なる場合、何らかの種類のトルク/回転が生成されます。

MassCenterX()MassCenterY()の物理動作式を使用してオブジェクトの重心を取得できます

ジョイントでオブジェクトの動きを制御する

ジョイントは、オブジェクトに追加の移動規則に従うようにオブジェクトに与えられる制限です。いくつかのジョイントはオブジェクトを固定点を中心に回転させ、他のジョイントは2つのオブジェクトを一緒に保持します

ジョイントID:
ジョイントを作成するときに変数名を渡すことができます。それを行うと、GDevelopは指定された変数にジョイントの一意の識別番号(ID)を格納します。ジョイントIDを使用すると、作成後にそれを変更し、値を確認して削除できます。屋根に取り付けられたロープにキーを貼り付けるジョイントを作成し、ジョイントIDを変数に保存すると、オブジェクトがロープと衝突するかどうかを確認し、保存されたIDを使用してジョイントを削除してキーを作成することを想像してください落ちる。

ジョイントIDは常にゼロより大きい数値になります

通常、ジョイント(前の例ではロープとキー)を定義するために2つのオブジェクトが必要ですが、例外は回転ジョイントです。詳細については、回転ジョイントの説明を確認してください。

すべてのタイプのジョイントに共通のプロパティ、条件、およびアクションのリストは次のとおりです。

  • ジョイントが先/次がオブジェクト: ジョイントがアタッチされている最初または2番目のオブジェクトである場合にオブジェクトを選択できる条件。
  • ジョイントが先/次がX/Yのアンカー: ジョイントがアタッチされている最初または2番目のオブジェクトアンカーポイントの位置を取得する式。
  • 反力/トルク ジョイント: 反力またはトルクをチェックするための条件と式。この値は、関節が平衡状態からどれだけ離れているかの尺度です。反力が大きすぎる場合、ジョイントがかなりの力で平衡位置から離れていることを意味します。壊れやすいジョイントを作るのに便利です。
  • ジョイントの削除: 指定されたジョイントを削除するアクション。ジョイントがギアジョイントの子の1つである場合、ギアも削除されます。ジョイントがアタッチされているオブジェクトのいずれかが削除されると、ジョイントも削除されます。

ジョイントにはさまざまな種類があり、それぞれに固有の動作とプロパティがあります。以下が一覧です。

1回だけ実行されるイベント(たとえば、シーンの開始時)でジョイントを作成してください。フレームごとにジョイントを作成すると、数秒で数百のジョイントが作成され、パフォーマンスの低下、非物理的な動作、メモリ消費によるクラッシュの可能性が生じます。

距離ジョイント

距離ジョイントは、2つのオブジェクトを指定された距離で分離しようとします。距離は、ジョイントアンカーポイントから計算されます。オブジェクトは常に指定された距離にあるわけではありませんが、オシレーターの式に従ってそれに到達する傾向があります。

設定:

  • 長さ: ターゲット距離。もし負の値が与えられた場合、ジョイントの作成時のオブジェクト間の距離が使用される。
  • 減衰比: オブジェクトが受ける「摩擦」、低い値はオブジェクトをより振動させ、高い値は振動を低減しますが、オブジェクトの動きは遅くなります。.
  • 頻度: オブジェクトが動作する速さ。値を小さくするとターゲットに到達するまでゆっくりと移動するソフトジョイントが生成され、値を大きくするとターゲットに到達するまでオブジェクトが非常に速く移動するハードなジョイントがシミュレートされます。
減衰比と頻度の値を低くすると、目標距離に近づく前に多くの動作を伴うソフトジョイントが生成されますが、両方の設定の値を高くすると、非常に硬いジョイントが生成されます。

回転ジョイント

回転ジョイントは「ピン」のように機能し、「ヒンジ」とも呼ばれ、オブジェクトを点の周りで回転させます。回転ジョイントには2つのタイプがあり、最終的にはほとんど同じですが、わずかな違いがあります

  • 2つのオブジェクト間の回転ジョイント: 2つのオブジェクトを「固定」し、アンカーポイントが重なるようにオブジェクトが一緒に移動し、各オブジェクトがアンカーポイントを中心に回転します。2枚のカードをピンで留めて、ピンの周りを自由に移動および回転できるように投げることを想定して下さい。
  • 1つのオブジェクトの回転ジョイント: ジョイントは通常2つのオブジェクト間で機能しますが、これは例外の1つです。このジョイントには、単一のオブジェクトとそのアンカーポイントが必要であり、指定された固定位置にオブジェクトを固定します。壁にメモを固定するようなものだと考えてください。メモはピンを中心に回転できますが、移動することはできません。
1つののオブジェクトバージョンのジョイントでは、オブジェクトはジョイントの2番目のオブジェクトとして追加され、最初のオブジェクトはジョイント部が非表示の静的ボディであるため、ギアのようにこのタイプのジョイントを使用できます。

回転ジョイントで設定できる項目は次のとおりです。

  • 角度制限: 有効にすると、回転は最小角度と最大角度の間で制限されます。両方の角度は最初のオブジェクトに対して相対指定であることに注意してください。
  • 基準角度: ゼロと見なされるオブジェクト間の角度。すべての角度プロパティをオフセットします。参照角度が15度の場合、ワールド座標でオブジェクト間の角度が15度のときに現在のジョイント角度を要求すると0が返され、最大角度を30に設定すると45(最初のオブジェクトに対して)に設定されます。
  • 最小角度: 最初のオブジェクトに対するオブジェクト間の最小角度。最大角度以下でなければなりません。
  • 最大角度: 最初のオブジェクトに対するオブジェクト間の最大角度。最小角度以上でなければなりません。
角度制限のある回転ジョイントを使用して、関節、つまりラグドールをシミュレートできます!
  • モーター: 有効にするとジョイントは2番目のオブジェクトに回転力を追加し、モーターのように外力を必要とせずに回転させます。有効にした場合、モーター速度と最大モーター回転力を設定することを忘れないでください!
  • モーター速度: 目標のモーター速度(1秒あたりの度数)。これは、2番目のオブジェクトが最初のオブジェクトの周りを回転しているときに到達しようとする速度です。モーター速度は、オブジェクトを時計回りに回転させる場合は正、反時計回りに回転させる場合は負になります。
  • 最大モーター回転力: モーターが目標モーター速度に到達するために費やすことができる最大回転力(トルク)。正でなければなりません。

また、シミュレーション中に次の値にアクセスできます。

  • ジョイント角度: 最初のオブジェクトを基準にして、参照角度の影響を受けるオブジェクト間の現在の角度。
  • ジョイント速度: 現在のジョイントの角速度、つまり、2番目のオブジェクトが最初のオブジェクトの回転に対して回転する速度。
  • ジョイントモーター回転力: 現在のモーター回転力は、目標モーター速度に到達するために必要な回転力であるため、最大モーター回転力よりも低くすることができます。
回転ジョイントのその他の用途には、ピンボールレバー、トップダウンドア、ブリッジとしての自動回転機などがあります。

プリズムジョイント

プリズム(角柱)ジョイントは「ピストン」のように機能し、「スライダー」としても知られています。与えられた軸で、オブジェクトを上下にスライドさせます。良い例はエレベータです。エレベータはレールに沿って垂直軸に移動し、レールは最初のジョイントボディ、エレベータは2番目のジョイントボディになり、軸は上向きまたは下向きの角度(-90または90度)になります。 。

プリズムジョイントに固有の設定:

  • 軸角度: 移動方向を決定する角度。軸角度0は水平移動を意味します。値はワールド座標で指定されますが、軸は最初のオブジェクトの方向に従って回転します(エレベータレールを回転させると、エレベータの移動角度も回転します)。
  • 基準角度: 回転ジョイントの場合と同様に、この角度は軸にオフセットを追加し、新しい「角度ゼロ」を確立します。基準角度が15の場合、(最初のオブジェクト方向に対する)ワールド座標での15の軸角度は0として扱われます。
  • 移動制限: 有効にすると、2番目のオブジェクトの動きは、指定された最小移動値と最大移動値の間で制限されます。
  • 最小移動値: 2番目のオブジェクトが最初のオブジェクトから移動できる最小位置。エレベータの例では、最小の移動値はフロア階です。
  • 最大移動値: 2番目のオブジェクトが最初のオブジェクトから移動できる最大位置。エレベーターの例では、屋上です。
変換制限範囲にはゼロを含める必要があり、最小変換5と最大変換10(範囲[5、10])は、ゼロを含む範囲[0、10]に変換されます
  • モーター: 有効にすると、ジョイントは2番目のオブジェクトに力を加えて、特定のモーター速度に到達します。有効にした場合、モーター速度とモーター最大力を忘れずに設定してください!
  • モータースピード: モーターが到達しようとする目標速度。正の場合、2番目のオブジェクトは軸方向に移動し、負の場合は反対方向に移動します。
  • モーター最大力: モーターが目標速度に達するために費やすことができる最大力。正でなければなりません。

また、シミュレーション中に以下の値にアクセスできます。

  • 移動の結合: 2番目のオブジェクトが最初のオブジェクトに対して相対的に移動した現在の移動値。
  • ジョイント速度: 2番目のオブジェクトが現在の速度で、軸に沿って、最初のオブジェクトの速度に対して相対的に移動します。
  • モーター推進力の結合: モーターが2番目のオブジェクトに適用している現在の力。この値は、目標モーター速度に到達するために必要な力であるため、最大モーター力よりも低くなる可能性があります。

滑車ジョイント

単純な名前の単純なジョイント。このジョイントにより、各オブジェクトからその地上位置までの距離の合計が一定になり、他の言葉を使用して理解するのがはるかに簡単になります。滑車をシミュレートします:)

固定ポイントAの下に3メートル垂れ下がったボックスと、固定ポイントBの下に2メートル垂れ下がった円があり、両方のオブジェクトが同じロープの端に取り付けられているとします。ロープの長さは一定であるため、ボックスを上に移動すると、Aの下にわずか1メートルぶら下がって、円は同じ距離、Bの下に4メートル移動する必要があります。円とBの間の距離は常に5メートルです。
distance(box, A) + distance(circle, B) = constant

比率:
簡単ですか?クレイジーな部分であるこのジョイントは、特別な設定である比率をサポートしています。この比率により、ロープは一方の側で他方よりも伸びやすくなります。たとえば、ボックス側の1メートルのロープを、サークル側の2メートルのロープに等しくすることができます(比率= 1/2 = 0.5)。

最初の例に戻ります:Aは3メートル下のボックス、Bは2メートル下の円ですが、比率は0.5です。ここで、ボックスを2メートル上に移動すると、円が4メートル下に移動します。明らかに、ロープの長さは一定ではありませんが、次のとおりです
distance(box, A) + ratio*distance(circle, B) = constant (最初の式は、この式の特定のケースで、比率= 1であることに注意してください).

また「ロープ」はまったくないことに注意してください。ジョイントは、オブジェクトとアンカーポイントの間の距離でのみ機能します。

ジョイント設定は次のとおりです

  • 最初のグラウンドポイント: 最初のオブジェクトがアタッチされる固定ポイント(例では、ポイントA)
  • 2番目のグラウンドポイント: 2番目のオブジェクトが固定されている固定ポイント(例ではポイントB)
  • 最初の長さ: 最初のオブジェクトとその接地点の間の最初のロープの長さ。値が負またはゼロの場合、ジョイントを作成する瞬間の距離が使用されます。
  • 2番めの長さ: 2番目のオブジェクトとそのグランドポイント間の最初のロープの長さ。値が負またはゼロの場合、ジョイントを作成する瞬間の距離が使用されます。
  • 比率: 上記で説明した、両側の距離の比率。比率が0.33の場合、1番目の側の1メートルは2番目の側の3メートルに相当します。

ギアジョイント

このジョイントは非常に特殊で、2つのボディを直接結合するのではなく、ギアが2つの他のジョイントを結合します。これらの子ジョイントは回転またはプリズム(角柱)ジョイントでなければなりません。 2つのジョイントがギアジョイントを介してリンクされている場合、一方のジョイントの動きにより、もう一方のジョイントが動きます。たとえば、プリズムジョイントの軸に沿ってオブジェクトを移動すると、リンクされた回転ジョイントが回転し、逆も同様です。

このジョイントも非常に注意が必要です!ギアを機能させるには、各子ジョイントの関節の最初のボディが静的で、2番目のボディが動的でなければなりません。 2つの回転ジョイント、2つのプリズムジョイント、または回転ジョイントとプリズム柱ジョイントを連動させることができますが、常に各ジョイントの最初のボディは静的でなければなりません!

ギアの子ジョイントの最初のボディは静的でなければなりません。そのため、回転ジョイントの単一オブジェクトバージョンでは、最初のボディが非表示の静的オブジェクトであることを明確にしています

ギアジョイントの設定:

  • 最初のジョイント: 回転ジョイントまたはプリズムジョイントは、2番目のジョイントにリンクされます。
  • 2番めのジョイント: 回転ジョイントまたはプリズムジョイントは、最初のジョイントにリンクされます。
  • 比率: プーリージョイントと同様に、ギアは「比率」をサポートし、同様に機能します。比率= 0.33の2つの回転ジョイントをリンクすると、最初の回転の各回転は2番目の回転の3回転に相当します。ただし、プーリージョイント比には違いがあります。ギア比は負になる可能性があり、一方のジョイントで正の動きを可能にし、もう一方のジョイントで負の動きを生成します。たとえば、比率= -1の2つの回転関節をリンクする場合、回転関節の時計回りの回転は、歯車のように、もう一方の反時計回りの回転を生成しますか?
ギアの存在に必要な条件は、2つの子ジョイントの存在です。2つのジョイントのいずれかが削除されると、ギアも自動的に削除されます。

マウスジョイント

このジョイントは必ずしもマウスに関連しているわけではありませんが、非常に一般的です。このジョイントは、オブジェクトをターゲット位置に向かって移動します。ターゲット位置を連続的に更新してマウスまたはタッチ位置をターゲットにすると、オブジェクトをドラッグできます。

他のジョイントとは別の例外であることに注意してください。これは、動作するために単一のボディを必要とするジョイントです。つまり、ターゲットに向かって移動するオブジェクトです。

マウスジョイントの設定:

  • オブジェクト: ターゲット位置に向かって移動するオブジェクト。
  • ターゲット: オブジェクトが到達しようとするターゲットポイント。ジョイントを作成した後、何度でも更新できます。
最初の目標位置(ジョイントの作成時)は、オブジェクトのアンカーポイントとしても使用されるため、必ず設定してください!
  • 最大推進力: 目標位置に到達するためにジョイントがオブジェクトに加えることができる最大推進力、数値が大きいほど、オブジェクトは速く動きます。正の値でなければなりません。
  • 頻度: 距離ジョイント周波数のように機能し、オブジェクトがターゲットの周りをどれだけ速く推進するかを決定します。
  • 減衰比: 距離ジョイント減衰比のように機能し、時間に沿ってオブジェクトを減速させます。
マウスジョイントは、マウスのみでの使用に限定されず、任意のワールドポイントをターゲットとして受け入れます。

ホイールジョイント

特別に指定されたジョイント。ホイール(車輪)が必要な場合、このジョイントが必要になります。最良のジョイントがホイールジョイントであり、車両のホイールとは異なるケースを考えるのは困難です。 車両の車輪をシミュレートするために作られた、このジョイントはそれだけを行いますが、非常にうまくいきます!

ホイールジョイントでは、回転ジョイントとプリズムジョイントの両方を考えることができます。回転ジョイントは、2番目のオブジェクト(ホイール)を回転させるために使用されます。 プリズムジョイント機能は、車両のホイールサスペンションをシミュレートすることです。従来のプリズムジョイントとして、軸の角度を設定してホイールの並進方向を定義できます。一般に、軸の方向は垂直ですが、たとえば、バイクの場合、前輪のサスペンションの方向は垂直とは異なります(場合によっては非常に遠い)。

ホイールとして機能するボディは、ジョイントの2番目のオブジェクトでなければなりません。

ホイールジョイントの設定は次のとおりです。

  • 軸の角度: プリズム(角柱)ジョイントの軸角度に相当し、ホイールと最初のオブジェクト間の移動(またはスライド)の方向を決定します。
  • 頻度: サスペンションの頻度。距離ジョイントの頻度に相当します。値を大きくすると、ホイールの振動が速くなります。
  • 減衰比: 距離減衰比に相当するサスペンションの減衰。値を大きくすると、ホイールの動きが遅くなります
  • モーター: 有効にすると、ジョイントはホイール(2番目のオブジェクト)にトルクを加えて、モーターの目標速度に到達します。有効にした場合、モーター速度と最大モータートルクを設定することを忘れないでください!
  • モーターの速度: ホイールが到達しようとする目標角速度。時計回りの回転の場合は正、反時計回りの回転の場合は負になります。
  • モーターの最大回転推進力: ジョイントがホイールに加えてモーターの目標速度に到達できる最大推進力(トルク)。正でなければなりません。

シミュレーション中にアクセスできる追加の値:

  • ジョイントの距離: サスペンション軸に沿った現在のホイール移動。
  • ジョイントの速度: 現在のホイール回転速度。
  • ジョイントのモーターの推進力: ジョイントがホイールに加えている現在のトルク。目標速度に到達するために必要なトルクであるため、最大モータートルクよりも低くなる可能性があります。

溶接ジョイント

このジョイントは非常に基本的であり、2つのオブジェクトを貼り付け/接着し、1つのオブジェクトであるかのように移動しようとします。

これを使用して壊れやすいオブジェクトを作成できますが、乱用しないでください!すべてのオブジェクトがソフトジョイントでアタッチされ、多数のオブジェクトが貼り付けられたり、密度が大きく異なると、物理的に不正確な結果になる可能性があります。

溶接ジョイント固有の設定:

  • 基準角度: 最初のオブジェクトの角度に対する2番目のオブジェクトの角度。
オブジェクトをジョイント作成時の角度で固定するには、オブジェクト間の相対角度(差)を参照角度として使用します: SecondObject.Angle() - FirstObject.Angle()
  • 頻度: 距離ジョイント頻度のように機能し、オブジェクトが振動して静止位置に到達する速度を決定します。
  • 減衰比: 距離ジョイント減衰比と同様に機能し、時間に沿ってオブジェクトを減速します。

ロープジョイント

別の単純なジョイント。これにより、2つのオブジェクトがロープで仮想的にリンクされるようになります。この方法では、ロープの長さよりも長い距離で分離することはできませんが、その下の任意の距離に置くことができます。

滑車ジョイントのように、実際のロープはまったくありません。ジョイントはオブジェクト間の距離をチェックし、距離が指定された長さより大きい場合に反応します。

ロープジョイントに固有の唯一の設定:

  • 最大長: オブジェクト間の最大距離。初期値が負の場合、ジョイント作成時のオブジェクト間の距離が使用されます。

摩擦ジョイント

摩擦ジョイントは、Z軸の摩擦をシミュレートし、2つのオブジェクト間の相対速度や角速度を遅くするため、線形摩擦と角摩擦をシミュレートできます。.

オブジェクトの1つが静的である場合、摩擦ジョイントを使用して、ビリヤード台やトップダウンレーシングゲームなどのトップダウンゲームで摩擦を正しくシミュレートできます。

摩擦ジョイント設定:

  • 最大推進力: ジョイントがオブジェクトに適用できる最大力。値が大きいほど、直線摩擦が大きくなります。

最大回転力: ジョイントがオブジェクトに適用できる最大トルク。値が大きいほど、角摩擦が大きくなります。

モータージョイント

モータージョイントは、少なくとも直接ではなく、実際のモーターとはあまり関係ありません。2つのオブジェクトをモータージョイントでリンクすると、オブジェクトは、他のオブジェクトに加えてオフセットを基準にしたターゲット位置や角度に到達しようとします。

考慮すべき2つのこと:

  • ジョイントはまったく剛性ではなく、オブジェクトはターゲットの位置または角度から遠く離れている可能性があります。補正係数は、レストポーズに到達するためにどれだけ速く移動および回転するかを示します。\\たとえば、常に立ち上がるパンチングバッグのおもちゃの1つを想像してください。地面とバッグをリンクするモータージョイントを使用してシミュレートできます。この方法では、バッグオブジェクトをどれだけ押しても、ジョイントは元の角度に戻そうとしますが、自動的には戻りません。
  • 障害物がある場合、モータージョイントは停止します。\\パンチングバッグの例に戻ると、地面に置いておくために大きな物体で押した場合、実際のようにモータージョイントは押し戻すことができません。
このジョイントはアンカーポイントを使用しないことに注意してください。オフセット位置は、線形オフセットと角度オフセットのみを使用して設定する必要があります。このジョイントのアンカーポイントにアクセスすると、オブジェクトの位置が返されます。

モータージョイントの設定:

  • オフセット X/Y: 最初のオブジェクトに対する2番目のオブジェクトのオフセット位置。ジョイントの作成時に現在のオブジェクトの位置を使用するには SecondObject.X() - FirstObject.X() and SecondObject.Y() - FirstObject.Y()を使います。
  • オフセット角度: 最初のオブジェクトに対する、2番目のオブジェクトの角度オフセット。ジョイントの作成時に現在のオブジェクトの相対角度を使用するには SecondObject.Angle() - FirstObject.Angle()を使います。
  • 最大推進力: ジョイントがオブジェクトをターゲット位置に移動するためにオブジェクトに適用できる最大力。値が大きいほど、必要な場合にオブジェクトがより速く移動します。この値がゼロの場合、直線の補正は行われず、オブジェクトは目標位置に到達するために移動しません。
  • 最大回転力: ジョイントがオブジェクトをターゲット角度まで回転させるためにオブジェクトに適用できる最大トルク。値が大きいほど、必要な場合にオブジェクトがより速く回転します。この値がゼロの場合、角度補正は行われず、オブジェクトは目標角度に到達するために回転しません。
  • 補正係数: オブジェクトがターゲットの位置と角度に到達するために移動および回転する速度。補正が高いほど、オブジェクトの移動や回転が速くなります。補正は、ジョイントが使用できる最大の推進力と回転力(トルク)によって制限されます。