number.epsilon不能直接用于3d碰撞检测,它仅表示双精度浮点数在1附近的最小可分辨差(≈2.22e-16),适用于验证数学恒等式或归一化检查;而碰撞容差须按物理尺度(如1e-3米)、速度与时间步长(如0.002–0.008米)动态设定。

Number.EPSILON(在 JavaScript 中为 Number.EPSILON ≈ 2.220446049250313e-16)是 1 与大于 1 的最小可表示浮点数之间的差值,它**不能直接用作碰撞检测的容差阈值**。把它当作“万能精度下限”套用到 3D 碰撞逻辑中,反而会导致误判——比如永远判定不相交,或在宏观尺度下触发大量虚假碰撞。
理解 Number.EPSILON 的真实作用范围
它反映的是双精度浮点数在数值 1 附近的相对精度极限,适用于判断 接近零的差值是否由舍入误差引起,例如:
- 验证数学恒等式是否因计算误差失效(如
Math.cos(x)**2 + Math.sin(x)**2 === 1) - 归一化向量后检查长度是否仍≈1
- 避免除零前判断分母是否“实质为零”
但它不适用于位置、距离、穿透深度等具有物理单位的量——这些值的量级可能从 0.001 米(毫米级角色脚部偏移)到 1000 米(开放世界坐标),而 EPSILON 对应的是 10⁻¹⁶ 量级,在这类场景下比量子尺度还小万亿倍,完全脱离工程实际。
一款AI工具,主要用于在持久tmux会话中运行AI编码代理(Codex、Claude Code),使用Ralph重试循环和完成钩子处理多步骤编码任务,适合需要提升相关任务效率的用户。
为 3D 碰撞设定合理阈值的核心原则
阈值必须与**检测目标的物理尺度、运动速度、时间步长及预期稳定性**对齐,而非浮点格式本身。常用策略如下:
-
按几何体典型尺寸缩放:若角色包围盒边长约 2 米,可设
EPSILON_WORLD = 1e-3(1 毫米),用于 AABB 重叠判断或法向量校正 -
按时间步长反推:若帧率 60 FPS(Δt ≈ 0.0167s),物体最大速度 10 m/s,则单帧位移约 0.17 米;穿透容忍量通常取其 1%~5%,即
0.002–0.008 米 -
分离轴定理(SAT)中的投影重叠判定:比较两个投影区间 [minA, maxA] 和 [minB, maxB] 是否相交时,使用
maxA - minB 比硬比 <code>=== 0更鲁棒
实际代码中如何安全使用容差
避免直接写 a === b 或 dist 。推荐模式:
- 距离比较:
vec3.distanceSquared(a, b) (平方距离免开方,阈值对应约 0.001 米) - AABB 相交判断(Three.js 风格):
function aabbIntersects(a, b) {<br> return a.max.x >= b.min.x - 1e-5 &&<br> a.min.x a.max.y >= b.min.y - 1e-5 &&<br> a.min.y a.max.z >= b.min.z - 1e-5 &&<br> a.min.z } - 法向量归一化后校验:
Math.abs(vec3.length(v) - 1.0) ,而非 <code>
何时需要动态调整阈值
固定阈值在跨尺度场景中会失效。例如数字孪生系统同时建模芯片引脚(微米级)和厂房结构(百米级)。此时应:
- 对不同层级对象使用独立容差(如微观部件用
1e-6,宏观建筑用1e-2) - 在 CCD(连续碰撞检测)中,根据运动距离自适应阈值:
adaptiveEps = Math.max(1e-5, 0.01 * speed * deltaTime) - 对高精度需求路径(如机器人抓取仿真),启用双精度计算路径,并将阈值设为
1e-8量级










