2Dオブジェクトをラッピングするピンと張ったワイヤーによって加えられる力を計算するにはどうすればよいですか?


10

私が「ワイヤー」と呼ぶ物理プリミティブがあり、2D環境にラップされていると仮定します(この質問で説明されているように)。

これはどのようなものかを示す図です。

静的および動的なゲームオブジェクトの周りにラップされたワイヤ

例の図では、ボックスはワイヤーによって上方に(持ち上げられて)引っ張られており、ボックスはワイヤーを下方に引っ張っています。スプリング上の物体はワイヤーによって押し下げられていますが、ワイヤーを押し上げています。

私はまだそれを実装する方法を理解していませんが、ワイヤーがラップされているポイントを横切ってワイヤーが自由にスライドすると仮定します。

2D物理シミュレーション(つまり、フレームベース)では、このようなワイヤーに接続またはラップされているオブジェクトに適用する力(またはインパルス)をどのように計算しますか?


最初の質問で触れたようにワイヤー上の「静的な」オブジェクトが最後の質量である場合、力は前の質量と点の間の固定長のジョイントと同じになると想像しますワイヤーで。

回答:


9

ワイヤーを引っ張る箱はワイヤーに張力をかけます。張力は力であり、ニュートンで測定されます。いくつかの単純化の仮定(ワイヤーと環境の間の摩擦がない)を行うと、張力はワイヤーに沿ったすべての点で同じになります。

例が静的であると考える場合、ワイヤーの張力は箱の重量にすぎません。

T = m * g

ここで、mはボックスの質量、gは重力による加速度です(9.8 m / s ^ 2)。これは静的な場合にのみ有効であることに注意してください。動的な場合の計算方法の説明については、以下を参照してください。

ワイヤーの各曲げにおける力は、関連する方向への張力の投影です。たとえば、ばねオブジェクトの先端の力は、接触法線に沿った大きさの力です。

F = T * cos(angle between wire and contact normal)

この場合、接触法線方向は、ワイヤーセグメント間の角度の二等分になります。環境の2番目にマークされたポイントでの力は、緊張やその他に影響を与えないため、無関係です。

ここで、動的な場合、張力は単にボックスをワイヤーに接続したままにするためにボックスに加える拘束力です。したがって、物理エンジンがインパルスベースの場合、緊張は次のようになります。

T = impulse / timestep

これは、ワイヤを環境に巻き付ける一般的なアルゴリズムにもつながります。重要な特性は、ワイヤーの全長です。シミュレーションする必要があるのは最後のセグメントのみであり、それ以前のセグメントはすべて修正済みと見なすことができます。したがって、最後のセグメントの長さがわかります。合計の長さから前のセグメントの長さを引くだけです。次に、最後のセグメントを単純なばね拘束にすることができます。次に、環境と交差するときにセグメントを分割し、曲げがまっすぐになったら分割を削除します。


だから-明確にするために:私は、ワイヤーの次の「曲がり」で世界に接続する固定長のジョイントに自由質量を持っているでしょう。そのジョイントが各フレームのボックスにどのようなインパルスを加えるかを調べ、そこからワイヤーの張力を得ることができますか?
アンドリューラッセル

また、私は心配していF = T * cos(angle between wire and spring axis)ます。正確にはどの角度ですか?また、(シミュレーションでは)そのオブジェクトにスプリングが接続されていることをワイヤーに「知らせる」ための賢明な方法はないと思います。
アンドリューラッセル

@Andrew-最初の点では、はい、ジョイントによってボックスに加えられる力は、定義上、ワイヤーの張力と等しくなります。2番目の点については、その通りです。これは明確ではありませんでした。実際には、ワイヤーと接触点の法線の間の角度です。これをより明確にするために、回答を編集しました。
Niall、2010

4

これらのワイヤーベースのスレッドに対するあなたの不満を間違いなく感謝します。それは解決するのが難しい問題です。衝突が完全に機能することはありませんでしたが、制約シミュレーションは確実に実行可能で簡単です。

ワイヤー拘束は実際には通常の距離拘束とほとんど同じです。2つの拘束点の代わりに、各セグメントに1つ、n個のセグメントを持つワイヤーにn + 1があります。終点では、ヤコビアンは距離拘束と同じです(つまり、d / | d |のようなもので、dはベクトルです)ポイント間)、および内部ノードの場合、ヤコビアンは(a / | a |-b / | b |)のようなものです。ここで、aおよびbはノードから隣接ノードへのベクトルです。(申し訳ありませんが、これに触れてから数年になります...)

あなたの例では、オブジェクトが他のセグメントと相互作用することができるので、「最後のセグメントのみが動的である」ので、それを偽造することはできませんが、ロープの端で質量をシミュレートする必要があるだけです。大衆でありません。各ノードで計算された制約インパルスは、そのノードで衝突するオブジェクトに適用する必要があります。

ここにいくつかの関連する論文があります:

最初の3つは比較的最近のものであり、非常に役立つはずです。下部のペーパーの75ページでは、本質的にワイヤーである「マルチバー」制約について説明しています。

幸運を :)

ライガン


0

基本的な考え方は、ロープの長さは変わらないということです。押し上げられている場合は、そこに「分割ポイント」を作成する必要があります。次に、その方向に「伸びる」ことができないので、ロープがどの側に取り付けられるかを決定します。右側のものに付いているので、左側のロープが短くなり、分岐点と接続点の間の断片が少し長くなります。次に、ニアルが言ったように、ワイヤーの張力を計算します。これを行う方法は、ロープの各「ピース」の張力を計算することです。これを使用して、関与する力を決定できます。

お役に立てれば。


本当に、ごめんなさい。
アンドリューラッセル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.