【发布时间】:2011-06-21 08:19:41
【问题描述】:
我的物理世界中的重力 Vector2 是 (0; 0.1)。
已知数字 0.1 是有问题的,因为“它不能精确表示,但大约是 1.10011001100110011001101 × 2-4”。
拥有这个重力值会给我带来碰撞问题并产生非常讨厌的错误。将值更改为 0.11 可以解决这些问题。
有没有更优雅的解决方案,根本不需要改变值?
错误视频
http://www.youtube.com/watch?v=bRynch1EtnE
源代码
第一种方法(AABBIsOverlapping)检查两个 AABB 实体之间的交集。 第二个方法(Update)每帧都会为每个body调用。
我将尝试解释 Update 方法的工作原理:
- 将重力加速度矢量与速度矢量相加
- 创建一个临时向量(下一个)并将其设置为速度
- 在当前主体周围的单元格中获取空间散列中的主体
- 如果存在水平重叠,解决它,将 next.X 和 velocity.X 设置为 0 并移动播放器
- 如果存在垂直重叠,解决它,将 next.Y 和 velocity.Y 设置为 0(或设置为 0.1 以防止从天花板上不断跳跃)并移动播放器
- 循环结束后,如果没有重叠,移动播放器
【问题讨论】:
-
0.11也无法准确表示。 -
奇怪...它以某种方式解决了问题。我的猜测是,使用 0.11 会产生足够小的误差,以至于物理引擎不会受到它的影响。
-
你没有写任何关于你的物理引擎是如何工作的。这很可能是问题所在。
-
我正在用一些源代码更新帖子。
-
已添加。您可能还想查看我对 Krom 回复的评论以了解更多说明
标签: c# floating-point physics