2つのオブジェクト間で回転を維持する


9

XNAゲームでは、2つのオブジェクトが衝突しています。最初のオブジェクトが他のオブジェクトと衝突すると、そのオブジェクトにラッチして、世界中を移動することができます。ここで数学に問題があります(数学は私の強みではありません)。私は現在、2番目のオブジェクトを最初のオブジェクトにラッチして移動しますが、元の方向を維持することができません。そのため、オブジェクトが上を向いている場合は、元のアイテムと一緒に回転している方法に対してこの方向を維持する必要があります。

ここに画像の説明を入力してください

これを達成するための最善の方法に関するヒントはありますか?


両方のオブジェクトは、他のオブジェクトの中心の軸を中心に回転すると思います。
MichaelHouse

回答:


3

角度に関する限り、2番目のオブジェクトの角度を最初のオブジェクトの角度と同じに保つだけです。位置については、2つのオブジェクトが互いに衝突したときに、距離の式を使用して、最初のオブジェクトから最初のオブジェクトまでの距離を求めます。

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

最初のオブジェクトに対する2番目のオブジェクトの位置を見つけるには:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)

2

@tesselodeの回答に加えて、ゲーム内のすべてのワールドオブジェクトのアタッチされたオブジェクトのリストを保持することをお勧めします。の線に沿った何かList<WorldObject> AttachedObjects。次に、衝突を検出したら、黒い長方形を赤い長方形に追加しますAttachedObjects。その後は、親の位置を更新するたびに、@ tesselodeのメソッドを使用して子の位置を更新するだけです。


2

フォークリフトのように、2つのうちの1つが他の1つを制御することを想定しています。あなたの図面では、これが黒いものであり、赤いものがパッケージであると想定しています。あなたは角度で問題が発生しているとだけ言っているので、これで説明します。

オブジェクトがラッチするとき、2つの間の角度の違いを覚えておく必要があります(これをシータと呼びます)。私はこれを図2に描きました。最初の図の矢印を互いに重ねて描いています。オブジェクトのラッチが解除されるまで、図3に示すように、赤のオブジェクトの角度は黒の角度とシータで決まります。

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

角度差


1

オブジェクトの子オブジェクトを持つ機能を実装できます(子オブジェクトは、親の位置/回転の変更によって自動的に影響を受けます)。次に、それらが一緒にラッチする必要があるときに衝突すると、非表示のオブジェクトを作成し、アタッチされたオブジェクトの両方をその子にします。次に、個々のオブジェクトに変換(移動、回転)を適用する代わりに、大きなオブジェクトに適用します。または、個々の子オブジェクトに力を適用して、「親はいますか?」をチェックし、はい、力は親に送られます(すべての子オブジェクトからの力を、それ自体に適用される1つのベクトルにマージします)。

また、ラッチされたオブジェクトの重みに従って非表示の親の重心を計算した場合、Johnの方法では達成できないようです(結合されたオブジェクトは新しい共有の重心を中心に回転しますが、オブジェクトの1つの重心の周り)、追加のコードを必要とせずに、この種の動作を簡単にネストできます。より堅牢で柔軟なアプローチのようです。

+子に加えられた力が関節を破壊するのに十分強い場合、条件は、親と子の関係を削除するだけで、その「ラッチ解除」を処理できます。子が1つだけ残っている場合は、それも分離して、非表示の親も削除します。

興味があれば、詳細(写真と少なくとも疑似コードなど)を提供できます。

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