【问题标题】:Testing for alignment with floating point测试是否与浮点对齐
【发布时间】:2018-01-03 19:56:03
【问题描述】:

这是一个物理引擎:

当一个物体在斜坡上碰撞时,它的速度会相应地调整到与斜坡平行。

为了检查一个物体是朝着还是远离斜坡移动,我在斜坡的法线和物体的速度之间使用了一个点积。

问题是由浮点数学引起的。有时,物体的速度与斜坡平行,但不是完全平行,导致它被检测为碰撞。

在大多数情况下,这是不正确的,因为速度会不断地重新调整为平行,再次检查并再次被检测到。

有什么方法可以避免这种行为而不必存储额外的变量?

(我可以轻松添加斜坡的副本以检查它最近是否被击中,但这会导致对每个对象进行更多检查)

【问题讨论】:

    标签: c++ floating-point floating-accuracy dot-product


    【解决方案1】:

    您可以设置与导致碰撞检测检查的斜率的最小偏差。即如果斜坡非常相似,不要检查碰撞。例如偏差小于 0.01° 应视为平行。

    【讨论】:

    • 这是可能的,但是它会导致在进行检查之前将点积除以斜率的长度。否则,较长的斜率将具有与较短的斜率不同的阈值。这为支票添加了平方根这一事实非常糟糕,因为它更难计算。
    • 您可以将坡的法线除以坡的长度一次,然后您不必一遍又一遍地重新划分。但是,根据用例,这当然会对性能产生重大影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多