ボールをボールの衝突-利益著しい速度に衝突
-
23-08-2019 - |
質問
私のコードからの質問"ボールをボールの衝突検出および取り扱い"をObjective-Cしかし、ボールの衝突角度、その速度は急激に増加します。すべてのベクトル数を使って行われ cocos2d-iphone, のヘッダCGPointExtension.hです。原因は何ですかこの望ましくない加速?
以下の例の増加速度:
入力:
mass==12.56637
速度です。x==1.73199439
速度です。y==-10.5695238
ます。mass==12.56637
ます。速度です。x==6.04341078
ます。速度です。y==14.2686739
出力:
mass==12.56637
速度です。x==110.004326
速度です。y==-10.5695238
ます。mass==12.56637
ます。速度です。x==-102.22892
ます。速度です。y==-72.4030228
#import "CGPointExtension.h"
#define RESTITUTION_CONSTANT (0.75) //elasticity of the system
- (void) resolveCollision:(Ball*) ball
{
// get the mtd (minimum translation distance)
CGPoint delta = ccpSub(position, ball.position);
float d = ccpLength(delta);
// minimum translation distance to push balls apart after intersecting
CGPoint mtd = ccpMult(delta, (((radius + ball.radius)-d)/d));
// resolve intersection --
// inverse mass quantities
float im1 = 1 / [self mass];
float im2 = 1 / [ball mass];
// push-pull them apart based off their mass
position = ccpAdd(position, ccpMult(mtd, (im1 / (im1 + im2))));
ball.position = ccpSub(ball.position, ccpMult(mtd, (im2 / (im1 + im2))));
// impact speed
CGPoint v = ccpSub(velocity, ball.velocity);
float vn = ccpDot(v,ccpNormalize(mtd));
// sphere intersecting but moving away from each other already
if (vn > 0.0f) return;
// collision impulse
float i = (-(1.0f + RESTITUTION_CONSTANT) * vn) / ([self mass] + [ball mass]);
CGPoint impulse = ccpMult(mtd, i);
// change in momentum
velocity = ccpAdd(velocity, ccpMult(impulse, im1));
ball.velocity = ccpSub(ball.velocity, ccpMult(impulse, im2));
}
解決
私の書いたのオリジナルのボールバウンスコードださい。の場合 ダウンロード うるコードで見られるように働きます。
次のコードが正しいのだったのだが):
// collision impulse
float i = (-(1.0f + RESTITUTION_CONSTANT) * vn) / (im1 + im2);
CGPoint impulse = ccpMult(mtd, i);
これは非常に共通の物理コードで見られまでほとんどの実施このように例えば次のようなものが挙げられ
この内容に間違いがないか確認し、あれ~ん~をコ以上1.0いて考えられる。これは計算上の相対的なインパルスベクターについては質量と反発係数.
を無視して摩擦、1dの内容は、以下のようになります:
J = -Vr(1+e) / {1/m1 + 1/m2}
EはおCoR,Vrは正常化速度およびJにはスカラー値のインパルス速度です。
だって何よりこけていただきたいするものではなく、一切の多くは物理学の図書館でもあるようです。ような成分が含まれています上記のコードでした数のボールが飛った数百開始前にチョーク.私はBox2Dの物理エンジンとそのソルバーを取り扱うことができますのボールではありません。
とにかく、見たコードは、一見晴(写忠実な翻訳).であろう小さな、微妙な誤った値が渡されたベクトルの数学の問題です。
なことはわかりませんに関するiPhone開発も提供している設定のブレークポイントップの方法及び監視の各段階の値を見るのであったと思います。です。確実にMTDが正しく計算の速度などまでに大幅に増加する。
報告書の価値観の各ステップの方法がまだいております。
他のヒント
るとこのコードおよび意見の提出について独自のポスターは、コードのように同じなので、原作とは正しい実装は、被疑者の悪いベクトル図書館など初期化されていない変数となります。
なぜ追加1.0に係?
: http://en.wikipedia.org/wiki/Coefficient_of_restitution
のコリントは一般的に、番号の範囲[0,1].定性的には、1は完璧に弾性衝突、0は完全に非弾性衝突.Aコ以上つ理論的には、衝突を生成する運動エネルギーなどの地雷がスローされや爆発的な増加を続けている。
次に問題なのはこの
/ (im1 + im2)
んとに分割しての和reciprocalsめには、大量の車のインパルスをベクターの連絡-おかき分けによって大衆のです。この拡大インパルス("う"と言った).
このライン:
CGPoint impulse = ccpMult(mtd, i);
mtdにつきましては、以下のnormalised.エラーのためのコードmtd正常化前のもの中に入っていないコードです。き直すというようになります:
CGPoint impulse = ccpMult(ccpNormalize(mtd), i);