如何在弹跳球穿过表面后重新定位它
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)
和 .
两个向量之间将表示标量积。
所以你可以用你命名的变量directionX
、directionY
和dist
.
来表达SE
- A) 将中心移动
SE
。耶,完成了!
- B) 获取
C
。将中心移动 SE - 2 * (CE . u) * u
:因此是总移动,但移除超出表面的 CE
法线分量的两倍,有效地通过该表面镜像 CE
矢量。
- C) 获取
C
。将中心移动 SE - (CE . u) * u
:相同,但仅移除 CE
的法线分量一次,有效地将 CE
向量投影到红线上。
- D) 获取
C
。将中心移动 SC
.
我有一个弹跳球,它可以碰撞具有随机斜率的线。球穿过一点点的线,我需要将球后退到距线 "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)
和 .
两个向量之间将表示标量积。
所以你可以用你命名的变量directionX
、directionY
和dist
.
SE
- A) 将中心移动
SE
。耶,完成了! - B) 获取
C
。将中心移动SE - 2 * (CE . u) * u
:因此是总移动,但移除超出表面的CE
法线分量的两倍,有效地通过该表面镜像CE
矢量。 - C) 获取
C
。将中心移动SE - (CE . u) * u
:相同,但仅移除CE
的法线分量一次,有效地将CE
向量投影到红线上。 - D) 获取
C
。将中心移动SC
.