在碰撞检测c ++ opengl中减小弹跳后的球速度

时间:2015-05-16 10:25:34

标签: c++ opengl collision-detection

如何在弹跳后降低球的速度并在c ++ opengl碰撞检测中停止球并且不要永远反弹?

//处理所有球 - 球碰撞

void handleBallBallCollisions(vector<Ball*> &balls, Octree* octree) {
vector<BallPair> bps;
potentialBallBallCollisions(bps, balls, octree);
for(unsigned int i = 0; i < bps.size(); i++) {
    BallPair bp = bps[i];

    Ball* b1 = bp.ball1;
    Ball* b2 = bp.ball2;
    if (testBallBallCollision(b1, b2)) {
        //Make the balls reflect off of each other
        Vec3f displacement = (b1->pos - b2->pos).normalize();
        b1->v -= 2 * displacement * b1->v.dot(displacement);
        b2->v -= 2 * displacement * b2->v.dot(displacement);
 }}}   
void applyGravity(vector<Ball*> &balls) {
for (unsigned int i = 0; i < balls.size(); i++) {
    Ball* ball = balls[i];
    ball->v -= Vec3f( 0, GRAVITY * TIME_BETWEEN_UPDATES, 0);


}

2 个答案:

答案 0 :(得分:1)

为两个球添加阻尼系数&#39;碰撞后的速度Ball::v。在物理上,这将是非弹性散射,其中部分能量以热量的形式消散。

答案 1 :(得分:0)

当物体相互接触时,您需要添加一个定义衰减的变量, 像你一样计算新的速度后,你必须将它乘以衰减变量

float attenuation = 0.8;

b1->v -= 2 * displacement * b1->v.dot(displacement);
b2->v -= 2 * displacement * b2->v.dot(displacement);

b1->v *= attenuation;
b2->v *= attenuation;