我正在开发一个非常基本的2D平台,我想知道我是否能在遇到的问题上得到建议。为了保持碰撞检测的简单性,我使用AABB和分离轴测试来进行碰撞检测,这在大多数情况下都很好。问题是,当某些东西移动得太快时,我的算法就会变得混乱,并返回一个错误的校正。
例如,英雄站在平台的边缘(从边缘1到5 5px)并跳跃。当英雄倒地回到平台时,他穿过平台(> 5像素),然后我的碰撞检测将他移到平台旁边,英雄跌落到了他的末日。我理解原因-在平台的边缘,英雄更多地穿透物体的y轴,因为它是x轴,我选择较小的距离来修正。
立即的答案是改变我的运动代码,所以它做了多个测试之间的几个位置之间的对象开始和结束的位置,但我的大脑强迫症比特抱怨浪费周期,等等.
在开始分析代码之前,我想知道是否有一种更优雅的方法来解决这个问题?我的假设是错的吗?我有没有搞错AABB SAT测试?我应该使用不同的算法吗?
发布于 2013-04-02 13:42:37
我发现在平台游戏中帮助缓解这个问题的一种方法是在SAT算法中优先检查哪个轴。例如,即使x距离比y距离短,您也可以调整算法,使其始终先推y轴。这样,即使你的角色站在平台的边缘,他也会被推上去。
如果您没有任何性能问题,那么在起始位置和结束位置之间执行多个碰撞测试是一个很好的解决方案。您可以在一定程度上优化它,通过移动最大的距离,您可以逃脱,而不是一个像素的时间。例如,如果你的形状是一个半径为40的圆,那么一次移动20个像素就可以了(半径的一半,这样你就不会穿过薄薄的物体)。
如果您想要一个更健壮和更快的解决方案,那么您应该使用一个连续的碰撞检测算法。与其与物体相交,然后再进行校正,一种连续的算法考虑到了速度并确定了撞击的时间,然后你就可以将目标定位到它需要的位置。
使用SAT (假设没有旋转)实现连续碰撞检测实际上并不太困难。您使用的算法可能让您移动对象,然后通过搜索重叠范围来检查多轴上的冲突。若要将其修改为连续的,请不要先移动对象。相反,您可以通过查找每个轴上最近的点之间的距离并除以物体移动的速度(在该轴上)来计算多个轴上的碰撞时间。最小的时间是物体的撞击时间,如果它小于零,那么物体就已经碰撞了。
发布于 2013-04-02 13:48:04
在您的游戏中,您将需要分离碰撞检测和碰撞响应的逻辑。碰撞检测是对“是对象A与对象B的碰撞”这个问题的答案,在这种情况下,您可以识别。碰撞响应是对以下问题的回答:“如果对象A与对象B发生碰撞,我如何将它们分开?”
好像你在处理碰撞反应方面有困难。根据你的游戏,你必须弄清楚你到底想让玩家在这些情况下做什么。考虑到这一点,人们提出了许多不同的问题:
我个人的建议是,考虑到球员的速度,而不是简单地沿着最不穿透的轴移动:
abs(vel.y) > abs(vel.x)
,那么将他从y方向的碰撞中移出。abs(vel.x) > abs(vel.y)
,那么将他从x方向的碰撞中移出。https://gamedev.stackexchange.com/questions/53168
复制相似问题