假设我有一个圆形在一个矩形区域内弹跳。在某些时候,这个圆圈将与矩形的一个表面碰撞并反射回来。我这样做的通常方法是让圆圈重叠该边界,然后反映速度矢量。圆实际上与边界重叠的事实通常不是问题,在低速时也不是很明显。在很高的速度下,圆圈正在做一些不应该做的事情。
我想做的是以编程方式将反射考虑在内,并将圆圈放在正确的位置,然后再将其显示在屏幕上。这意味着我必须计算它到达当前位置和它的未来位置之间的边界的点 - 而不是计算它的新位置然后检查它是否已经到达边界。
这比通常的圆/矩形碰撞问题复杂一点。我有一个模糊的想法,我应该怎么做 - 基本上在当前位置和新位置之间创建一个边界矩形,这带来了它自己的一系列问题(因为矩形根据圆的方向旋转)速度)。但是,我认为这是一个常见的问题,并且已经存在一个共同的解决方案。
这种问题有共同的解决方案吗?也许我应该研究一些基本理论?
答案 0 :(得分:5)
由于你只有一个圆圈和一个矩形,它实际上非常简单。在尺寸为r
的矩形内弹跳的半径为w, h
的圆可以与圆的中心,p
内的点(w-r), (h-r)
相同。
现在位置更新变得简单了。鉴于您的位置x, y
和每帧速度dx, dy
,更新后的位置为x+dx, y+dy
- 除非您越过边界。如果您最终得到x+dx > W
(让W = w-r
),那么请执行以下操作:
crossover = (x+dx) - W // this is how far "past" the edge your ball went
x = W - crossover // so you bring it back the same amount on the correct side
dx = -dx // and flip the velocity to the opposite direction
同样适用于y
。您必须为每个维度中的相对边界设置类似(反射)检查。
答案 1 :(得分:0)
在每个步骤中,您可以计算下一帧的圆的投影/预期位置。
如果它位于矩形之外,那么您可以使用从旧圆位置到矩形边缘的距离以及“过去”下一个位置所在的矩形边缘的数量(相互穿透)以线性插值并确定圆圈“撞击”矩形边缘的精确时间。
例如,如果圆与矩形边缘相距10个像素,那么预计会移动到超出它的5个像素,你知道,对于时间步长的2/3(10/15),它会在其原始路径上移动,然后被反射并继续其剩余的1/3时间步(5/15)的新路径。通过计算运动的这两部分并将翻译“加”到一起,您就可以找到正确的新位置。
(当然,如果你在角落附近碰到它会变得更复杂,因为在时间步长期间,在不同的边缘可能会有几次碰撞。如果你有一个以上的圆圈移动,事情会变得复杂得多。但是这就是你可以从你问过的案例开始的地方
答案 2 :(得分:0)
横跨矩形边界的反射非常简单。只需获取物体通过边界的量并从边界位置减去它。如果没有反射的位置例如是(-0.8,-0.2)而左上角是(0,0),则反射位置将是(0.8,0.2)。