有时未检测到 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);
}
- m_container 是我的移动器容器:它基本上包含我场景中的所有“移动器”。
- m_container->m_ball 是这些移动器之一的指针。这是我为了“射击”其他移动者而发射的球。
- 等我觉得一切都清楚了,再问我有什么不明白的。
希望有人能帮助我...我已经完成了项目中的所有工作,这是唯一的问题!
这是一个 GIF,第一个球成功了,第二个球失败了:
我终于设法弄清楚发生了什么事。
问题是我的世界正在避免碰撞。我的意思是:当两个物体碰撞时,它们会自动相互反弹。
这个行为是问题所在,因为我的狩猎球的目标是与其他物体碰撞,所以......随机......它没有检测到一些碰撞,因为它在弹跳。
为了修复它,我从我的狩猎球中删除了它与场景中的其他移动者进行交互的事实。所以现在它只检查我的函数 checkMoverIsHit();
是否与其他移动器发生碰撞。
现在可以完美运行了。
对于这个项目,我使用 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,第一个球成功了,第二个球失败了:
我终于设法弄清楚发生了什么事。
问题是我的世界正在避免碰撞。我的意思是:当两个物体碰撞时,它们会自动相互反弹。
这个行为是问题所在,因为我的狩猎球的目标是与其他物体碰撞,所以......随机......它没有检测到一些碰撞,因为它在弹跳。
为了修复它,我从我的狩猎球中删除了它与场景中的其他移动者进行交互的事实。所以现在它只检查我的函数 checkMoverIsHit();
是否与其他移动器发生碰撞。
现在可以完美运行了。