如何在弹跳球穿过表面后重新定位它

How to repositionate a bouncing ball after it passed throug a surface

我有一个弹跳球,它可以碰撞具有随机斜率的线。球穿过一点点的线,我需要将球后退到距线 "radius" 的距离。

球(具有变量 x、y 和半径)以 speedX 和 speedY(从向量 directionX 和 directionY 乘以一个变量获得)行进,我可以知道中心和直线之间的距离 (dist),所以我可以知道小球穿过直线的像素数

认为在示例中球在直线后通过了 10 个像素(半径 - 距离),我需要将球的中心在相反的向量(directionX directionY)中后退 10 个像素。我的问题是:

我如何计算如何在 x 和 y 之间分割这 n 个像素,以便我可以从中心坐标中减去它们?

我可以想象你有 4 种不同的分辨率,但不清楚你想要哪一种。

在这儿,黑色箭头是碰撞前的帧和你要画的帧之间球心的移动。

A) 你现在的情况。

  • 亲:简单
  • con : 球在物理上不可接受的位置

B) 你计算弹跳后球应该在哪里(假设有弹性垫块)

  • 亲:最准确
  • 反对:您没有让球与表面接触的框架(但您在乎吗?)。

C) 球的位置是 A,回到与表面相切的位置,修正正交于所述表面

  • pro : 在平行于表面的方向上保持精度
  • con : 球的中心不在反射线上(即我们可以随意使用笛卡尔定律)

D) 球还在传入线上,但在与曲面相切时停止了。

  • pro : 只有 speed/timing 被
  • 弄乱了
  • con : 错误....这里没有想法。仍然不如 B.
  • 精确

好吧,不管所有的图纸,只取球的中心要容易得多,并认为它击中了真实表面 'radius' 处的一条线(并与其平行),所以我们只有一个点的机制。因此,从上一张图片中,我们根据以下红色对象得到公式:

那么我们需要做什么呢? 未受干扰的轨迹从 S 点开始,在 E 点结束(情况 A 的终点)。我们将 C 称为两条线(红色线和轨迹,因此是轨迹 D 的端点)之间的碰撞点。

我假设我们总是在碰撞的情况下,因此未受干扰的轨迹和表面之间的交点C总是存在的。

您还需要垂直于表面的矢量 u。确保采用指向球所在一侧的单位向量。因此,如果您的坡度有一个方程 ax+by+c=0,则从向量 ( a/sqrt(a*a+b*b) , b/sqrt(a*a+b*b) ) 开始,如果它指向错误的一侧,则将两个坐标乘以 -1

然后,要将直线沿 u 的方向移动距离 r,您需要等式 a(x-r*u.x)+b(y-r*u.y)+c=0 因此 ax+by+c-r*(a*u.x+b*u.y)=0

所以如果 r 是半径并且 ax+by+c=0 你的表面,红线的方程是 ax+by+c+r*sqrt(a*a+b*b)=0-r 如果球在线下。

我将写 PQ 从点 P 到点 Q 结束的矢量,因此所述矢量的坐标将是 (Q.x - P.x, Q.y - P.y). 两个向量之间将表示标量积。

所以你可以用你命名的变量directionXdirectionYdist.

来表达SE
  • A) 将中心移动 SE。耶,完成了!
  • B) 获取 C。将中心移动 SE - 2 * (CE . u) * u :因此是总移动,但移除超出表面的 CE 法线分量的两倍,有效地通过该表面镜像 CE 矢量。
  • C) 获取 C。将中心移动 SE - (CE . u) * u :相同,但仅移除 CE 的法线分量一次,有效地将 CE 向量投影到红线上。
  • D) 获取 C。将中心移动 SC.