void deflect(object_t *obj1, object_t *obj2) { float impactnormal[2]; float velocitynorm[2]; float subtracted[2]; float dotproduct; vector_subtract(subtracted, obj1->position, obj2->position); vector_normalise(subtracted, impactnormal); vector_normalise(obj1->velocity, velocitynorm); dotproduct = vector_dotproduct(velocitynorm, impactnormal); obj1->velocity[0] += impactnormal[0] * -dotproduct * 1.5; obj1->velocity[1] += impactnormal[1] * -dotproduct * 1.5; obj2->velocity[0] += impactnormal[0] * dotproduct * 1.5; obj2->velocity[1] += impactnormal[1] * dotproduct * 1.5; } int spherecollide(object_t *obj1, object_t *obj2) { float relpos[1]; vector_subtract (relpos, obj1->position, obj2->position); float dist = relpos[0] * relpos[0] + relpos[1] * relpos[1]; float minDist = 20 + 40; return dist <= minDist * minDist; return false; } === main loop === obj->acceleration[0]= 0 / obj->mass; obj->acceleration[1] = gravity / obj->mass; obj->velocity[0] += obj->acceleration[0] * frametime; obj->velocity[1] += obj->acceleration[1] * frametime; obj2->acceleration[0]= 0 / obj2->mass; obj2->acceleration[1] = gravity / obj2->mass; obj2->velocity[0] += obj2->acceleration[0] * frametime; obj2->velocity[1] += obj2->acceleration[1] * frametime; if(spherecollide(obj, obj2)) { deflect(obj, obj2); } obj->position[0] += obj->velocity[0] * frametime; obj->position[1] += obj->velocity[1] * frametime; obj2->position[0] += obj2->velocity[0] * frametime; obj2->position[1] += obj2->velocity[1] * frametime;