Проверка 2D столкновений между 3 и более объектами - PullRequest
0 голосов
/ 20 февраля 2019

У меня проблема с моим алгоритмом проверки столкновений.Проблема в том, что когда я пытаюсь разрешить коллизии между 3 объектами, 1 из которых все еще не сталкивается и не разрешает коллизии, вот код:

void check_collisions(engine_t* engine)
{
    for (int i = 0; i < engine->actor_count; i++)
    {
        actor_t* first = (actor_t*)engine->collision_pairs->data[i];
        collider_t* a = (collider_t*)get_component_by_name(first, "collider");

        for(int j = 0; j < engine->actor_count; j++)
        {
            actor_t* second = (actor_t*)engine->collision_pairs->data[j];

            if(second == first)
                continue;

            collider_t* b = (collider_t*)get_component_by_name(second, "collider");

            hit_state_t hit = aabb(a, b);

            resolve_collisions(a, b, hit.normal);
        }
    }
}

Проблема в том, что когда, например: у меня есть A,B, C

A может сталкиваться с B и C в одно и то же время кадра. Похоже, что при столкновении большего количества объектов первый (первый) больше не будет рассчитываться ... любая идея?

void resolve_collisions(collider_t* a, collider_t* b, vec2_t normal)
{
    //Stop rigidbody
    vec2_t position = a->owner->transform.position;
    vec2_t position2 = b->owner->transform.position;
    rigid_body_t* rb = (rigid_body_t*)get_component_by_name(a->owner, "rigid_body");

    // if(!rb) { SDL_Log("rigid_body not while resolving collisions"); return; }

    //hit from dx
    if (normal.x > 0.0f && position.x < b->owner->transform.position.x + b->size.x)
    {
        rb->velocity.x = 0.0f;
        // SDL_Log("collided dx");
        position.x = (b->owner->transform.position.x + b->size.x) + 0.7f;
    }

    //hit from sx
    if (normal.x < 0.0f && position.x + a->size.x > b->owner->transform.position.x)
    {
        rb->velocity.x = 0.0f;

        float offset = b->size.x - a->size.x;
        float offset2 = a->size.x - b->size.x;
        // SDL_Log("collided sx");
        position.x = (b->owner->transform.position.x - b->size.x) + offset;
        position2.x = (a->owner->transform.position.x - a->size.x) + offset2;
    }

    //hit from top
    if (normal.y < 0.0f && position.y + a->size.y > b->owner->transform.position.y)
    {
        rb->velocity.y = 0.0f;
        float offset = b->size.y - a->size.y;
        position.y = (b->owner->transform.position.y - b->size.y) + offset;
    }

    //hit from bottom
    if (normal.y > 0.0f && position.y < b->owner->transform.position.y + b->size.y)
    {
        rb->velocity.y = 0.0f;
        // SDL_Log("collided bottom");
        position.y = (b->owner->transform.position.y + b->size.y) + 0.7f;
    }

    //change pos
    a->owner->transform.position = position;
}

любая помощь будет высоко ценится!-Спасибо

...