我正在测试四叉树中众多移动方块之间的碰撞。
当两个方碰撞时,我会反转它们的速度,如下所示:
for (auto pair : collisionPairs)
{
auto& square1 = static_cast<Square&>(*(pair.first));
auto& square2 = static_cast<Square&>(*(pair.second));
square1.setVelocity(-square1.getVelocity());
square2.setVelocity(-square2.getVelocity());
}
问题是,碰撞检测并不总是在一帧内。
有时候,它们是同一个正方形之间多个帧的碰撞,因为正方形已经交叉到深处。
因此方块重叠并且它们无限地反转它们的速度,这导致0速度(速度+速度= 0)
我该如何解决这个问题?
编辑:我发现深交会问题是由我的四叉树引起的,我忘了检查与儿童树的物体的碰撞。现在它仍然发生但很少发生,比如100次碰撞中的1次,然后是100次碰撞中的20次
答案 0 :(得分:2)
您可以为Square
课程另外提供inCollision()
个州,并另外检查此内容:
if(!square1.inCollision()) {
square1.setVelocity(-square1.getVelocity());
square1.setInCollision(true);
}
// Analogous code for square2
// Set inCollision state to false, when you build the collisionPairs
// Simplyfied pseudo code:
if(intersect(square1,square2) {
// make_pair blah blah
}
else {
square1.setInCollision(false);
square2.setInCollision(false);
}
答案 1 :(得分:2)
除了纯碰撞检测之外,我还要检查方块的中心是否朝向彼此移动,并且仅在第一种情况下恢复它们的速度。我要提供一个示例,您必须提供有关Square
课程实施的信息。
编辑:基本上逻辑看起来像这样:
if (collision detected) {
if ( (square2.posx-square1.posx)* (square2.vx-square1.vx) < 0) {
// EDIT: exchange velocities of square1 and square2 in x direction
}
if ( (square2.posy-square1.posy)* (square2.vy-square1.vy) < 0) {
// EDIT: exchange velocities of square1 and square2 in y direction
}
}
这当然远非逼真的碰撞模拟,但如果你只是想看看你的碰撞检测是否正常,那就足够了。 顺便说一句。我假设,矩形边缘都沿着x和y轴定向。