Objective-C での質問「ボールからボールへの衝突 - 検出と処理」のコードを実装しました。ただし、ボールが斜めに衝突するたびに、その速度は劇的に増加します。ベクトル計算はすべてcocos2d-iphoneを使用して行われ、ヘッダーは CGPointExtension.h です。この望ましくない加速の原因は何ですか?
高速化の例を次に示します。
入力:
質量 == 12.56637
速度.x == 1.73199439
速度.y == -10.5695238
ボールの質量 == 12.56637
ボールの速度.x == 6.04341078 ボールの速度
.y == 14.2686739
出力:
質量 == 12.56637
速度.x == 110.004326
速度.y == -10.5695238
ボールの質量 == 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));
}