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