有时未检测到 2 个球体之间的 OpenGL 碰撞

OpenGL Collisions between 2 spheres sometimes not detected

对于这个项目,我使用 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);
}

希望有人能帮助我...我已经完成了项目中的所有工作,这是唯一的问题!

这是一个 GIF,第一个球成功了,第二个球失败了:

我终于设法弄清楚发生了什么事。

问题是我的世界正在避免碰撞。我的意思是:当两个物体碰撞时,它们会自动相互反弹。

这个行为是问题所在,因为我的狩猎球的目标是与其他物体碰撞,所以......随机......它没有检测到一些碰撞,因为它在弹跳。

为了修复它,我从我的狩猎球中删除了它与场景中的其他移动者进行交互的事实。所以现在它只检查我的函数 checkMoverIsHit(); 是否与其他移动器发生碰撞。

现在可以完美运行了。