使用勾股定理进行碰撞检测是不可靠的
Collision detection using the Pythagorean theorem is being unreliable?
对象常常可以相互穿过?此外,当计算动量时,精灵偶尔会在碰撞时形成斑点,一起移动而不是反弹。
代码对大多数碰撞都有效,但它经常失败。什么好主意吗?
xV = X速度。yV = Y速度。每一帧,这个速度值被添加到四边形的X和Y位置。
bool Quad::IsTouching(Quad &q)
{
float distance = 0;
float combinedRadius = (size/2) + (q.GetSize()/2);
distance = sqrt(pow(q.GetX() - GetX(), 2) + pow(q.GetY() - GetY(), 2));
if(distance < combinedRadius)
{
return true;
}
return false;
}
void Quad::Collide(Quad &q)
{
float mX, mY, mX2, mY2, mXTmp, mYTmp;
mX = mass * xV;
mY = mass * yV;
mXTmp = mX;
mYTmp = mY;
mX2 = q.GetMass() * q.GetxV();
mY2 = q.GetMass() * q.GetyV();
mX = mX2;
mY = mY2;
mX2 = mXTmp;
mY2 = mYTmp;
xV = mX/mass;
yV = mY/mass;
q.SetxV(mX2/q.GetMass());
q.SetyV(mY2/q.GetMass());
}
我也遇到了同样的问题,下面是我制作的一个快速视频来演示这个问题。
解决这个问题的方法是计算碰撞的确切时间,这样粒子就会以新的速度移动迭代/时间步长的剩余时间。要做到这一点,你必须在更新位置之前检查是否会发生碰撞,所以:sqrt((x1 - x2 + dt * (vx1 - vx2))^2 + (y1 - y2 + dt * (vy1 - vy2))^2) <= distance
.
你也可以用一个更简单的解决方案,你稍微移动两个物体,这样它们就不会再碰撞了。这将导致创建器不准确,但确实需要更少的计算:
dx = x1 - x2;
dy = y1 - y2;
d = sqrt(dx^2 + dy^2);
D = r1 + r2;
if(d < D)
{
s = (d - D) / (2 * d);
x1 = x1 + s * dx;
x2 = x2 - s * dx;
y1 = y1 + s * dy;
y2 = y2 - s * dy;
}
你指的是什么类型的碰撞?弹性的还是非弹性的?对于弹性碰撞,代码将失败,您必须创建一个额外的属性来防止两个对象在接触时粘在一起。你还必须通过循环或if语句来确保,如果一个物体与另一个物体同时穿过另一个物体的位置,那么这两个物体将以与碰撞速度成正比的角度分开。使用适当的物理公式。
作为一个推断的、潜在的问题(没有提供速度、大小等的值,所以我不能肯定地说),你没有考虑到四轴是完全接触。也就是distance == combinedRadius
。因此,当这为真时,检查失败,然后对象在下一个tick继续移动…直接穿过彼此
将支票更改为distance <= combinedRadius
。此外,你可能只是得到了一个隧道效应,因为物体足够小,移动速度足够快,在每一个滴答声中它们都穿过彼此。有多种方法可以解决这个问题,其中一些是:施加最大速度和最小尺寸;增加物理检查的帧率;使用连续碰撞检查而不是离散检查:参见维基百科关于主题
- 落砂模拟碰撞检测C++和SFML
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- SFML 中的重力和碰撞检测
- 我的碰撞检测中的奇怪行为
- 如何为球形物体和三角形地形提供高效的碰撞检测和响应
- 圆形与方形碰撞检测以及需要响应C++ |OpenGL。我的问题就是这个"I need to keep the circle outside the square"
- 在Qt3D中进行碰撞检测的预期方法(或好方法)是什么?
- 在碰撞检测方面苦苦挣扎.如何正确检测碰撞?
- 三角形-三角形碰撞检测问题
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 编译时断言不可靠
- 不同类别之间的C SFML碰撞检测
- 使用D3DXVECTOR C 的碰撞检测,发生碰撞后该怎么办
- 当我发生碰撞检测时,矢量迭代器不兼容
- 如何使用灵活的碰撞库在两个点云或点云与机器人末端执行器模型之间进行碰撞检测
- 优化碰撞检测C
- 使用碰撞检测来增加SFML 2.4中的游戏分数的问题
- 如何在 box2d 中检测碰撞但不发生碰撞
- 使用勾股定理进行碰撞检测是不可靠的
- C++碰撞检测在上次检查时不起作用?