1

弾むボール プログラムの各ボールとの衝突検出が完了し、衝突後の次のイベントを知るための新しい問題が発生しました。別のボールを打った後、ボールの新しい速度を知ることに行き詰まりました。ここで説明した方法を試しました

アルゴリズムを実装しましたが、まったく機能しません。衝突後、ボールの速度はゼロになりました。生成された新しい値が 1.0e-13 未満であることがわかりました。これは、速度と座標の値を処理するために使用する float 型によってゼロに降格されました。

私が使用している方法が浮動小数点に適していないのか、それとも参考文献の手順を間違えただけなのかわかりません。私は物理が全く苦手です。

コードは次のとおりです。

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) そこで、結果という新しい変数を作成し、その値を合成ベクトルの x と y にしました。それを別のベクトルに分割します。

4

0 に答える 0