圆深度渗透

我正在解决圈子之间的一些冲突,我一直在解决这个问题。

注意:矩形是适合圆的正方形,所以当我键入rect.Width我的意思是圆的半径。

我试图做的是这样的,如果它渗透了它将被推出,然后其他的如果将接管,而不是叫如果了。 但深度却是一个很小的数字,例如.6,因为它是一个向下的浮动,根本不影响矩形。 即使我在那里添加一个循环函数,它也开始抖动一堆。

if (r < rect2.Width / 2 + rect1.Width / 2 && (fN + fG + fA).Length() != 0) { // Resolve depth penetration float mDepth = rect2.Width / 2 + rect1.Width / 2 - r; Vector2 depth = new Vector2(mDepth * (float)Math.Cos(theta), mDepth * (float)Math.Sin(theta)); rect2.X -= (int)depth.X; rect2.Y -= (int)depth.Y; // Apply an equal and opposite force fN = -fG // Stop the earth from moving v2 = Vector2.Zero; } else if(r == rect2.Width / 2 + rect1.Width / 2) fN = -fG; else fN = Vector2.Zero; 

我也尝试过改变深度穿透力,但结果没有什么不同。

 float mDepth = rect2.Width / 2 + rect1.Width / 2 - r; Vector2 direction = rect1.Location.ToVector2() - rect2.Location.ToVector2(); direction.Normalize(); Vector2 depth = direction * mDepth; rect2.X -= (int)depth.X; rect2.Y -= (int)depth.Y; 

我们能想到的唯一解决scheme是创建一个5的范围,其中的对象可以rest。

 if (r < rect2.Width / 2 + rect1.Width / 2 + 5 && r > rect2.Width / 2 + rect1.Width / 2) fN = -fG; else if (r < rect2.Width / 2 + rect1.Width / 2 && (fN + fG + fA).Length() != 0) { // Resolve depth penetration float mDepth = rect2.Width / 2 + rect1.Width / 2 - r; Vector2 depth = new Vector2(mDepth * (float)Math.Cos(theta), mDepth * (float)Math.Sin(theta)); rect2.X -= (int)depth.X; rect2.Y -= (int)depth.Y; // Apply an equal and opposite force fN = -fG; // Stop the earth from moving v2 = Vector2.Zero; } else fN = Vector2.Zero; 

有没有更好的方法来做到这一点?

这是一个video概述了这个问题。 https://www.youtube.com/watch?v=ZREQDA5BN0s本质上,因为深度parsing不是确切的,if语句的==部分没有被使用我知道这是因为我在第一个if语句中放置了一个断点去那里的深度是0.6左右。 然后向下滚动,根本不移动它。 如果我把它适当的,它只是抖了一堆。

是的,你可以做到这一点,没有昂贵的触发。

脚步:

  1. find2个圆圈之间的距离。
  2. find两个圆之间的组合半径。
  3. 减去组合半径的距离,得到穿透深度。
  4. 将穿透深度乘以圆圈之间的方向。

即:

 Circle c1; Circle c2; float Distance = (c1.position - c2.position).magnitude; float CombinedRadius = c1.radius + c2.radius; float Depth = CombinedRadius - Distance; Vector2 Direction = (c1.position - c2.position).normalized; Vector2 Penetration = Direction * depth; //Resolve the collision c1.position -= Penetration / 2; c2.position += Penetration / 2; 

这是2圈的渗透。 至于一个圆和一个轴alignment的方形,我不确定你要去哪里,但是穿透vector就是对象边界框的穿透。

如果你想要更精确一点,你可以find圆与方形中心之间的方向,然后将圆和方形投影到它上面,然后通过在该方向上减去圆和方的范围来find穿透vector。