OpenGL Столкновения между двумя сферами иногда не обнаруживаются - PullRequest
0 голосов
/ 21 июня 2020

Для этого проекта я использую OpenGl.

Я пытаюсь обнаружить столкновение между двумя сферами, я думаю, это довольно просто. Это работает, но иногда (очень часто на самом деле ...) столкновение между этими двумя сферами не обнаруживается, и я действительно не знаю, почему ... Я пытался изменить алгоритм обнаружения, и это всегда заканчивается отсутствием обнаружения иногда ...

void MyGlWindow::checkMoverIsHit()
{
    for (size_t i = 0; i < m_container->m_movers.size(); i++)
    {
        if (m_container->m_ball != m_container->m_movers[i]) {
            float size = m_container->m_ball->m_size + m_container->m_movers[i]->m_size;
            if (size >= (m_container->m_ball->m_position - m_container->m_movers[i]->m_position).magnitude())
            {
                score += 10;
                m_container->m_movers.erase(std::remove(m_container->m_movers.begin(), m_container->m_movers.end(), m_container->m_movers[i]), m_container->m_movers.end());
                for (size_t i = 0; i < (score / 10) + 1; i++)
                    createMover();
                reload();
            }
        }
    }
}

Я вызываю эту функцию в своей функции обновления.

void MyGlWindow::update()
{
    TimingData::get().update();

    if (!run) return;

    float lastFrameDuration = (float)TimingData::get().lastFrameDuration;

    float duration = lastFrameDuration * 0.003;

    totalTimePrecise += lastFrameDuration;
    totalTimeSec = totalTimePrecise / 1000;

    if (totalTimeSec > 60) {
        writeBestScoreInFile();
        restart();
    }

    if (totalTimeSec == 40)
        windBlowing = true;

    if (duration <= 0.0f) return;

    m_container->update(duration);

    if (windBlowing == true)
        m_container->windBlow();

    checkBallDetachFromAnchor();
    
    checkMoverIsHit(); // !!! ITS CALLED HERE !!!

    m_world->runPhysics(duration);
}
  • m_container - мой контейнер движущихся объектов: он содержит в основном все «движители» моей сцены .
  • m_container-> m_ball - указатель одного из этих движителей. Это мяч, который я запустил, чтобы «выстрелить» в других движущихся людей.
  • После того, как я думаю, что все достаточно ясно, спросите меня, если что-то не так.

Надеюсь, кто-нибудь может мне помочь ... . Я сделал все в своем проекте, это единственное, что глючит!

Вот GIF, первый шар сработал, второй нет: Пример ошибки обнаружения столкновения между двумя сферами

1 Ответ

0 голосов
/ 23 июня 2020

Мне наконец удается выяснить, что происходит.

Проблема в том, что мой мир избегает столкновений. Под этим я подразумеваю: когда два объекта сталкиваются, они автоматически отскакивают друг от друга.

Такое поведение было проблемой, потому что цель моего охотничьего мяча - столкнуться с другими объектами так ... случайным образом. ... он не обнаруживал некоторых столкновений, потому что это происходило.

Чтобы исправить это, я удалил из своего охотничьего шара тот факт, что он итеративно взаимодействует с другими движущимися в сцене. Так что теперь он проверяет мою функцию checkMoverIsHit(); только на то, не сталкивается ли она с другими движителями.

Теперь она работает отлично.

...