POSITIVE_INFINITY是边界标记值,用于表示无上限或跳过约束,不可直接赋给速度参与物理计算;需配合isfinite()检查,在速度钳制、CCD开关等场景中作为配置语义值使用。
在物理引擎中,double::positive_infinity(c++ 中为 std::numeric_limits<double>::infinity()</double>,.net 中为 double.positiveinfinity)不是用来“设为无限大速度”,而是作为**边界标记值**,用于表达“无上限”或“跳过某类约束”的语义。直接将物体速度赋为正无穷会导致后续计算崩溃(如加速度除零、动能爆炸、nan 传播),因此必须配合明确的判定逻辑使用。
用作无约束标志位:跳过速度钳制
当某个刚体被设计为“不受最大速度限制”(例如摄像机跟随目标、某些特效粒子、调试模式下的自由移动体),可用 POSITIVE_INFINITY 表示其速度上限无效:
- 定义成员变量:
double maxSpeed = std::numeric_limits<double>::infinity(); - 在速度更新后做安全钳制:
if (std::isfinite(maxSpeed)) {<br> double speed = velocity.length();<br> if (speed > maxSpeed) {<br> velocity *= (maxSpeed / speed);<br> }<br> } - 这样,普通物体设
maxSpeed = 10.0生效;调试时只需改一行maxSpeed = infinity(),无需修改分支逻辑。
参与比较运算:避免特殊值污染
POSITIVE_INFINITY 在比较中天然满足数学序关系(例如 5.0 < POSITIVE_INFINITY 为真,POSITIVE_INFINITY == POSITIVE_INFINITY 也为真),但需注意:
- 不可用于算术运算:
velocity += POSITIVE_INFINITY→ 结果为inf,后续length()仍为inf,再平方或点积会触发未定义行为。 - 应始终用
std::isfinite()或!std::isinf()做前置检查,尤其在接触响应、阻尼衰减、能量计算等敏感路径中。 - 示例:阻尼更新中排除无限速度项
if (std::isfinite(velocity.x)) velocity.x *= damping;
与碰撞响应协同:防止穿透误判
在连续碰撞检测(CCD)中,若某物体理论运动距离趋于无穷(如极高速度+极大时间步),可能导致射线投射失效。此时可将 POSITIVE_INFINITY 作为“禁用 CCD”信号:
- 为刚体添加字段:
double ccdSweepDistance = std::numeric_limits<double>::infinity(); - CCD 执行前判断:
if (std::isfinite(ccdSweepDistance)) {<br> runContinuousCollisionDetection(...);<br> } else {<br> // 回退到离散检测 + 额外穿透修正<br> resolvePenetration(...);<br> } - 这样既保留高性能默认路径,又支持对特定对象关闭高开销 CCD。
核心原则是把 POSITIVE_INFINITY 当作一种“配置语义值”,而非物理量。它让边界逻辑更清晰、切换更轻量,但绝不参与真实动力学计算。

















