2Dスプライトの回転力の計算


35

誰かが次のシナリオを計算するエレガントな方法を持っているかどうか疑問に思っています。

私は(n)個の正方形、ランダムな形状のオブジェクトを持っていますが、それらはすべて長方形のふりをします。

私たちは重力を扱っていないので、空間内のオブジェクトをトップダウンの観点から検討します。下の図のように、特定の正方形のオブジェクトに力を加えています。

力を加える

適用されている場所で、適用されている力に基づいて回転角度を計算する方法を教えてください。中央の正方形に適用すると、まっすぐになります。中心からさらに移動すると、どのように動作しますか?回転速度の計算方法は?


オブジェクトが回転すると、時間の経過とともに力に何が起こりますか?常に同じ方向の同じ正方形に適用されますか?オブジェクトの端に沿って「スイープ」しますか?提供する情報では、対応する回転力(別名トルク)のみを取得できますが、それから回転速度を推定する場合は、(力ではなく)インパルスを提供するか、方法を説明する必要があります。時間の経過とともに力を加える必要があります。
サムホセバー

正直なところ、これはおそらくphysics.stackexchange.comにとってより良い質問でしょう。これは基本的なメカニズムの問題だからです。
BlueRaja-ダニーPflughoeft

回答:


44

トルクを計算しようとしています。トルクは、適用される力F、適用点、およびオブジェクトの重心に依存します。

1)質量の中心。オブジェクトの重心を定義します。

2)適用点:力が作用する点を定義します。

3)モーメントアーム:上記で定義した2点間の距離。

Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass

4)角力:力Fを2つの直交ベクトルに分けます。1つは3)の線に平行で、もう1つは垂直です。平行成分は角運動量に影響しません。垂直のものはそうです。ベクトル投影により平行成分を計算できます。オリジナルからそれを差し引いて、垂直成分を取得できます。擬似コード(dotドット積を意味します)

Vector myForce
Vector momentArm

parallelComponent = momentArm * (dot(myForce, momentArm) / dot(momentArm, momentArm))
angularForce = myForce - parallelComponent

5)トルク:力の垂直成分にモーメントアームの長さを掛けたもの。

Vector angularForce
Vector torque = angularForce * momentArm.Length

トルクから角速度に到達するには:

1)慣性モーメント:与えられたオブジェクトが持つ回転慣性の定義。たとえば、同じ質量の球よりも長いバーを回転するには、より多くのトルクが必要です。リアリズムを気にしない場合は、慣性モーメントが質量に関連しているふりをするか、オブジェクトの形状と質量を完全に無視することができます。

2)角加速度

Vector angularAcceleration = torque / momentOfInertia

3)角速度:トルクが加えられている限り、角速度は増加し続けます。したがって、式は大まかに「時間Tでの角速度はTまでの角加速度の累積和です」となります。これは、擬似コードで次のように表現されます

void Update(float elapsedSeconds):
    orientation += 0.5 * angularVelocity * elapsedSeconds;
    angularVelocity += angularAcceleration * elapsedSeconds;
    orientation += 0.5 * angularVelocity * elapsedSeconds;

しかし、すばらしい情報ですが、私が最も不明確なのは、トルク力をどのように決定するかです。あなたが説明したように、私はすべてのコンポーネントを配置しています。
jgallant

@Jon:コンポーネントがあります。つまり、ステップ1〜3があり、ステップ4の計算方法がわかりませんか?それは主に難しいステップです。ここでもう少し詳細を追加します。
ジミー

3
角速度の累積和である方向orientation += angularVelocity * elapsedSecondsは、時間ステップにわたって速度を過大評価するため、間違っています。つまり、異なるフレームレートが異なる方向を与えることになります。適切な式は次のとおりfloat oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;です。また、重力がないため、代わりに「質量中心」を使用することをお勧めします。非常に良い説明のために+1。
サムホセバー

1
垂直力の一部は、重心を加速するように作用し、力が重心の近くに適用されると、この係数は増加します。答えは良くて非常に明確ですが、この点では不完全なようです。
サムワトキンス

私自身のコメントに答えるために、私はChris Heckerの物理に関する記事を読んでいます:chrishecker.com/Rigid_body_dynamics。あらゆる点での力または衝撃は、F = maまたはa2 = a1 + pに従って、重心によく知られている効果があることがわかります。まるで体が回転できないかのようです。これは、線形運動量の保存の法則に従います。半径に垂直な力の成分も、ジミーの答えで説明されているように、トルクと角運動量の変化を引き起こします。
サムワトキンス

7

力が強すぎない場合、複数のドットとそれらを接続するスプリングを使用して回転をシミュレートする方がはるかに簡単です。その場合、形状はスプリングで接続された複数のドットで構成されていると仮定します。各点は質量を表し、形状の他のすべてのものはゼロに等しい質量を持ちます。

春とドット

上の図では、黒い点は質量を表し、赤い線はばねを表します。その後、力を適用するには、最も近いドットに適用するだけで、オブジェクトが好きなように回転することがわかります。形状を立体構造のように見せるために、高い減衰値と高いk値を持つスプリングを定義することをお勧めします。

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