我的弹跳球程序中每个球的碰撞检测已经完成,现在有了新的问题来了解碰撞后的下一个事件。在击中另一个球后,我因为知道球的新速度而被卡住了。我尝试了这里讨论的方法
我实现了算法,但它根本不起作用。碰撞后,球的速度刚刚为零。我发现生成的新值小于 1.0e-13,它被我用来处理速度和坐标值的浮点类型降为零
我不知道我使用的方法是否不适合浮点数,或者我只是错误地按照参考中的这些步骤进行操作。我物理根本不擅长。
这是代码:
void Physics::Add(Ball object[]) {
for (int i = 0;i < Ball::numOfObj; ++i){
for(int j = 0;j < Ball::numOfObj; ++j){
if(i == j) break;
if(PotentialBallCollision(object[i], object[j])){
Vector2f normalVector ( object[i].pos.X - object[j].pos.X,
object[i].pos.Y - object[j].pos.Y);
float resultant = _sqrt((normalVector.X * normalVector.X) +
(normalVector.Y * normalVector.Y));
Vector2f resultantVector (resultant, resultant);
Vector2f unitNormal = (normalVector / resultantVector);
Vector2f unitTangent (-unitNormal.Y, unitNormal.X);
float velN1 = (unitNormal.X * object[i].vel.X) * (unitNormal.Y * object[i].vel.Y);
float velT1 = (unitTangent.X * object[i].vel.X) * (unitTangent.Y * object[i].vel.Y);
float velN2 = (unitNormal.X * object[j].vel.X) * (unitNormal.Y * object[j].vel.Y);
float velT2 = (unitTangent.X * object[j].vel.X) * (unitTangent.Y * object[j].vel.Y);
velN1 = (velN1 * (object[i].mass - object[j].mass) + 2 * (object[j].mass * velN2)) /
(object[i].mass + object[j].mass);
velN2 = (velN2 * (object[j].mass - object[i].mass) + 2 * (object[i].mass * velN1)) /
(object[i].mass + object[j].mass);
velN1 *= unitNormal.X * unitNormal.Y;
velT1 *= unitTangent.X * unitTangent.Y;
velN2 *= unitNormal.X * unitNormal.Y;
velT2 *= unitTangent.X * unitTangent.Y;
float newVel1 = velN1 + velT1;
float newVel2 = velN2 + velT2;
/*object[i].vel = Vector2f(newVel1 , newVel1); //<-- this is the generated velocities
object[j].vel = Vector2f(newVel2, newVel2);*/
object[i].vel.X *= -1; //fake physics
object[i].vel.Y *= -1; //
object[j].vel.X *= -1; //
object[j].vel.Y *= -1; //
}
if(PotentialWallCollision(object[j])){
switch(object[j].dir)
{
case Vector2f::UP:
case Vector2f::DOWN:
object[j].vel.Y *= -1;
break;
case Vector2f::LEFT:
case Vector2f::RIGHT:
object[j].vel.X *= -1;
break;
}
}
if(PotentialWallCollision(object[i])){
switch(object[i].dir)
{
case Vector2f::UP:
case Vector2f::DOWN:
object[i].vel.Y *= -1;
break;
case Vector2f::LEFT:
case Vector2f::RIGHT:
object[i].vel.X *= -1;
break;
}
}
object[i].pos += object[i].vel;
object[j].pos += object[j].vel;
}
}
}
我怀疑问题出在我自己制作的合成向量中,因为我不理解这个公式->Vectors: unitNormal = normalVector / sqrt(normalVector.X ^ 2 + normalVector.Y ^ 2)
所以我创建了一个名为 resultant 的新变量,并将该值设为合成向量的 x 和 y将其划分为另一个向量。