圆碰撞响应

时间:2011-03-25 11:29:45

标签: 2d response collision

我正在开发Android游戏,我需要互相反弹2个圈子(比如2个球池互相反弹)。碰撞是一种弹性碰撞,我需要计算碰撞后只有1个圆圈(在我的代码中称为粒子)新的速度(另一个圆圈,在我的代码中称为障碍物将保持静止并且由于碰撞而不会移动)。

我正在使用我在维基百科上找到的公式(http://en.wikipedia.org/wiki/Elastic_collision),但我对碰撞后粒子新速度的最终结果与速度完全相同碰撞前?

这是错误的,但我不知道我哪里出错了。谁能发现我哪里错了?

我刚刚使用Java程序来模拟我的速度和2个圆圈的位置,因为我不想在我的主要Android游戏中尝试它,因为害怕“破坏某些东西”

这是我到目前为止的内容(就像我刚才提到的,目前这只是NetBeans中的一个模拟,我将在我的Android游戏中使用一个menthod来保持一点点整洁):

double randomNextDouble = (new Random()).nextDouble();
    System.out.println("Random.nextDouble: " + randomNextDouble);

    double mathPI = Math.PI * 2;
    System.out.println("Math PI: " + mathPI);

    // get a random direction for the Particle to move towards
double direction = (new Random()).nextDouble() * Math.PI * 2;
    System.out.println("Direction: " + direction);

// Then set the Particle's velocity - Increase to make Particles move faster
int velocity = 10;
System.out.println("Velocity: " + velocity);

// Then calculate the xv and the yv
// Velocity value on the x and y axis
double xv = (velocity * Math.cos(direction));
    double yv = (velocity * Math.sin(direction));
    System.out.println("\nXV: " + xv + "\nYV: " + yv);


    // Genareting a random number for the Particle and Barrier's positions on screen
    double Xmin = 0;
    double Xmax = 300;

    double Ymin = 0;
    double Ymax = 300;

    double randomNumber1 = Xmin + (int)(Math.random() * ((Xmax - Xmin) + 1));
    double randomNumber2 = Ymin + (int)(Math.random() * ((Ymax - Ymin) + 1));
    double randomNumber3 = Xmin + (int)(Math.random() * ((Xmax - Xmin) + 1));
    double randomNumber4 = Ymin + (int)(Math.random() * ((Ymax - Ymin) + 1));

    // Setting the Particle and Barrier's radius
    double particleRadius = 8;
    double barrierRadius = 16;

    // Setting up the Particle and Barrier's mass
    double particleMass = 100;
    double barrierMass = 200;

    // Assigning a random number to the Particle to simulate its position on screen
    double particleX = randomNumber1;
    double particleY = randomNumber2;
    System.out.println("\nParticle X: " + particleX + " Particle Y: " + particleY);

    // Assigning a random number to the Barrier to simulate its position on screen
    double barrierX = randomNumber3;
    double barrierY = randomNumber4;
    System.out.println("Barrier  X: " + barrierX + " Barrier  Y: " + barrierY);



    double distanceXToBarrier = barrierX - particleX;
    System.out.println("\nBarrier X - Particle X: " + distanceXToBarrier);
    double distanceYToBarrier = barrierY - particleY;
    System.out.println("Barrier Y - Particle Y: " + distanceYToBarrier);

    // Get the distance between the Particle and the Barrier
    // Used for collision detection
    double distance = Math.sqrt((distanceXToBarrier * distanceXToBarrier) + (distanceYToBarrier * distanceYToBarrier));
    System.out.println("\nDistance: " + distance);

    // Check to see if the Particle and Barrier has collided
    if (distance <= particleRadius  + barrierRadius)
    {
        System.out.println("Distance is less than 2 Radii");
    }
    else
        System.out.println("Distance is NOT less than 2 Radii");

    // Velx = (v1.u) * u + (v1 - (v1.u) * u)
    // Vely = (v1.u) * u + (v1 - (v1.u) * u)
    // Where v1 = xv and yv respectively
    // Break it into 2 equations
    // (v1.u) * u AND
    // (v1 - (v1.u) * u)
    //
    // u = normalised Vector
    // To normalize you just devide the x, y, z coords by the length of the vector. 
    // This then gives you the Unit Vector.
    //
    //Normalize the vector
    double particleXNormalized = particleX * (1.0 / distance);
    double particleYNormalized = particleY * (1.0 / distance);
    System.out.println("\nParticle X Normalised: " + particleXNormalized +
                       "\nParticle Y Normalised: " + particleYNormalized);

    // Calculating the first part of the eqaution
    // (v1.u)
    double v1DotUForX = xv * particleXNormalized;
    double v1DotUForY = yv * particleYNormalized;
    System.out.println("\nv1.u for X: " + v1DotUForX +
                       "\nv1.u for Y: " + v1DotUForY);

    // The first part of the equation
    // (v1.u) * u
    double part1X = v1DotUForX * particleXNormalized;
    double part1Y = v1DotUForY * particleYNormalized;
    System.out.println("\nPart 1 for X: " + part1X +
                       "\nPart 1 for Y: " + part1Y);

    // The second part of the equation
    // (v1 - (v1.u) * u)
    double part2X = (xv - (v1DotUForX) * particleXNormalized);
    double part2Y = (yv - (v1DotUForY) * particleYNormalized);
    System.out.println("\nPart 2 for X: " + part2X +
                       "\nPart 2 for Y: " + part2Y);




    // Solving for:
    // (((mass 1 - mass2) / (mass1 + mass2) * (v1.u) * u + ((2mass2) / (mass1 + mass2) * ((v1.u) * u))) +
    //           (v1 - (v1.u) * u))
    double newXV = ((((particleMass - barrierMass) / (particleMass + barrierMass)) * part1X) + (((2 * barrierMass) / (particleMass + barrierMass)) * part1X) + part2X);
    double newYV = ((((particleMass - barrierMass) / (particleMass + barrierMass)) * part1Y) + (((2 * barrierMass) / (particleMass + barrierMass)) * part1Y) + part2Y);
    System.out.println("\nNew XV: " + newXV + "\nNew YV: " + newYV);

1 个答案:

答案 0 :(得分:0)

查看您的算法,您似乎在实现中出错了。为什么要规范化粒子的坐标?你不应该这样做速度吗?在通常的等式中,u是速度,而不是位置。

为什么要给粒子一个随机速度(xvyv),这与你为粒子和障碍物设置的两个随机坐标无关? (当然速度应该是(屏障 - 粒子)矢量的某个倍数?)