2012-05-03 21 views
1

私は動いているプラ​​ットフォーム(キネマティックボディ)を持っています。Box2Dでは、キネマティックプラットフォームとダイナミックボディのジッタを防ぐ方法を教えてください。

b2BodyDef platformDef; 
platformDef.type = b2_kinematicBody; 
platformDef.linearVelocity = b2Vec2(0.f, 0.5f); 

今私はどのプレイヤーがコントロールボール(動体)をしました、そして、それはそれの位置から上に行くために、前述のプラットフォームに乗ることができます。ここではボールのデータがあります:

b2BodyDef ballDef; 
ballDef.type = b2_dynamicBody; 
ballDef.fixedRotation = true; 
b2Body *ball = b2dWorld.CreateBody(&ballDef); 
b2FixtureDef fixDef; 
fixDef.shape = &shapeCircle; // a simple b2CircleShape with radius 0.6m 
fixDef.density = 1.f; 
fixDef.friction = 0.2f; 
fixDef.restitution = 0.3f; 
ball->CreateFixture(&fixDef); 

今、ボールは間違いなく、旅行全体でボールの体のわずかなジッタがあるとしながら、すなわち、それは継続的にそれが動いているプラ​​ットフォームと衝突し、移動プラットフォームの上に移動します。ボールの反発力を0に設定しようとしましたが、無駄です。

この詳細が必要な場合、システムのピクセルとメーターの比率は0.02です。

+0

あなたは目に見えて目立つジッタについて話していますか、BeginContact/EndContactコールバックがたくさんあるのですか?後者の場合、それについて何もできないことがあります。ボールがプラットフォーム上にあるときを知る必要がある場合は、プラットホーム上にあるときを検出するセンサとしてボールボディにもう少し大きなフィクスチャを配置する必要があります。視覚的に目立つジッタについて話しているなら、私はちょっと驚いています。私は基本的に同じことをやったが、ジッタは見つからなかった。(右上のボールを参照:http://www.youtube.com/watch?v=vXovY2KTing) – iforce2d

+0

@ iforce2d:まあ、私は第1の視覚的に目立つジッタ:(はい、私も驚いています。重力ベクトルの値を低く設定して、プラットフォームの運動体ですか? – legends2k

+0

はい、通常重力のキネマティックです。あなたのオブジェクトは本当に小さいですか?私たちにPTMを伝えることは、いくつかの実際のサイズがなければ助けになりません:) – iforce2d

答えて

1

私は、2つのボディ間の2つの溶接継手のうちの1つが最良の解決策であると考えています。次いで

体は、プラットフォームの「静的」である場合には(左右に移動していない)、ボールがプラットフォーム上にある間にボールとプラットフォームとの間の溶接接合部を作成します。ボールが左右に移動することができる場合

は、プラットフォームに関節平行の方向と、両者の直動関節を作成します。

私はクモが小惑星(here)を歩い作るために同様の技術を使用しています。

これを避けるための実際のアイデアは、シミュレーションのために必ずしも有効ではないシーンの背後にある体験を実際に強化するために使用できるツールが物理エンジンにあるということです。ダイナミクスを変更するには、状況のロジックを使用します。この場合

は、プラットフォームオンまたはオフであることは、あなたがより良い体験を提供するために、いくつかの他のメカニズムを接続または切断する必要がありしたことを意味します。

エンジンで処理できます。上記の例では、小惑星の境界の船体の各頂点で、体の周りを歩くために使用されるジョイントが変更されています。

関連する問題