Для этого проекта я использую 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, первый шар сработал, второй нет: Пример ошибки обнаружения столкновения между двумя сферами