1

Farseer Physicsを初めて使用し、バージョン3.3.1を使用しています。私はいくつかの助けを求めており、それを変換できるはずなので、応答を確実に受け取るためにBox2dの回答を喜んで受け取ります! - ありがとう

...何度もいじくり回した後、画面上に細い縦長の長方形を作成することができました。これを、設定した角度まで上部に固定して前後にスイングさせたいと思います(このサンプルでは90度で十分です)。 )。

それが頂上に近づいているとき、私はそれが減速し、それからそれがちょうど来たようにフォールバックし、速度を上げ、そして明らかに再び頂上で止まるまで減速することを望みます。揺れる海賊船がテーマパークでどのように機能するか。

これは私がこれまでに持っているコードで、シェイプをスイングしますが、スイングするたびに速度が低下し、最終的には停止するようです。

float playerWidth = ConvertUnits.ToSimUnits(5), playerHeight = ConvertUnits.ToSimUnits(68);
playerPosition = ConvertUnits.ToSimUnits(-350, 0);
playerBody = BodyFactory.CreateRectangle(World, playerWidth, playerHeight, 2f, playerPosition);
playerBody.BodyType = BodyType.Dynamic;
// create player sprite based on player body
_rectangleSprite = new Sprite(ScreenManager.Assets.TextureFromShape(playerBody.FixtureList[0].Shape, MaterialType.Player, Color.Orange, 1f));
// Create swinging joint
var joint = JointFactory.CreateFixedRevoluteJoint(World, playerBody, ConvertUnits.ToSimUnits(0, -34), playerBody.Position);

誰かがコマンドを提供することもできれば、マウスクリックまたはキーボードコマンドで現在の角度で図形を一時停止し、マウスクリックを離したときに続行する必要があります。これは非常に素晴らしいことです。

乾杯

4

2 に答える 2

1

振り子の目的に合わせて作成されていないシミュレーションは、時間の経過とともにエネルギーを失う可能性があります。

振り子が他の物理オブジェクトと相互作用する必要がある場合は、現在の状態を維持しますが、シミュレーションの実行中に、振り子を調整して継続します。たとえば、垂直方向にスイングするたびに、線形速度と角速度を最初に行ったときと同じ大きさにスケーリングします(たとえば、何かにぶつかった場合を除いて、そのように進み続けるべきではありません)。

何かと相互作用する必要がない場合、または反応せずに他のオブジェクトを押すだけの場合は、シミュレートされたリジッドボディにしないでください。代わりに、現在の時刻に基づいてアニメーション化(角度の設定)します。物理エンジンには、移動するが他のボディによって移動されないオブジェクトのオプションがある可能性があり、それはおそらくそのBodyTypeプロパティです。(振り子の位置の公式は時間の経過とともにわかりませんが、どこかで入手できると確信しています。)


あなたの質問の他のコピーから(ちなみに、そうしないでください。代わりにmodに質問を移行するように依頼してください)、相互作用させたくないが、固定されていないものに変換したいことがわかります。 (落下)体と背中。上で説明したどちらの戦略でもそれを処理できると思いますが、最初の戦略では実装に手間がかかりません。

于 2012-04-15T13:20:52.830 に答える
1

通常、このような状況でスイングしている体は、停止するまでに非常に長い時間がかかります(実際、ここで停止する方法を尋ねる質問があります...)ので、長く細い形状が再生されている可能性があると思います部。他の物理エンジンと同様に、Box2Dは長くて薄い形状に問題があります。

しかし、それはあなたの質問ではありません...スイングを変更せずに維持するには、各スイングの速度を、上部またはスイングの中間点を通過するときに手動で設定する必要があります。中点の方が安全で目立たないと思います。

ただし、この振り子は他のオブジェクトにぶつかる必要がありますか?重い物体を拾ったが減速しなかった場合、または速度を上げるポイントに到達するまで減速した後、突然速くなった場合は、奇妙に見えるかもしれません。動的に反応する必要がない場合は、フレームごとに適切な角速度を設定することで自分で制御するキネマティックボディを使用したほうがよい場合があります。

キネマティックボディを使用すると、質問の最後の部分も簡単になります。これは、再び移動する準備ができるまで速度をゼロに設定できるためです。動的なボディ/ジョイントの設定でこの効果を得るには、現在の線形速度と角速度をメモし、移動してはならないすべてのフレームでボディの重力をキャンセルしてから、速度を元に戻して維持する必要があります。再び移動します。しかし、この間に何かがぶつかると、そのトリックは失敗します。一時的に関節の限界(下/上)を同じ角度に設定して、関節に振り子を静止させることもできますが、5x68サイズのボディがこれらの制約の下でうまく機能するかどうかは本当に疑問です。

于 2012-04-15T09:29:42.023 に答える