# MuJoCo mj_ray射线穿过网格共享边时漏检返回-1或错误距离

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-10-17-mujoco-3698
> 频道：pitfalls | 更新日期：2026-10-17 | 标签：auto, github-issue, mujoco
> 核心摘要：MuJoCo 3.6.0中mj_ray因重心坐标严格比较导致共享边漏检，PR#3704引入Watertight边缘函数算法修复该问题。

# MuJoCo mj_ray射线穿过网格共享边时漏检返回-1或错误距离

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[mj_ray misses a ray that passes exactly through a shared edge of a mesh (non-watertight ray-triangle test)](https://github.com/google-deepmind/mujoco/issues/3698)（GitHub google-deepmind/mujoco #3698）

**状态**：有绕过办法

## 问题

在MuJoCo 3.6.0中，当`mj_ray`射线精确穿过mesh geom两个三角形的共享边时，因浮点精度误差导致重心坐标落在两个三角形外部而被同时拒绝，函数返回-1或穿透至后方表面。例如对棱柱顶点发射射线，预期命中距离0.96却返回1.04或-1。

## 环境

MuJoCo 3.6.0 Python bindings，Linux x86_64系统；涉及`src/engine/engine_ray.cc`中`ray_triangle`函数（行132-198）及barycentric accept/reject逻辑（行173）。

## 解决办法

1. 关注并合并PR #3704，该补丁将原有的2x2线性求解重心坐标测试替换为Woop, Benthin & Wald (2013)提出的Watertight边缘函数公式，包含边缘函数为零时的双精度回退机制，保持原有API签名与语义不变。
2. 若需临时规避，避免让射线原点或方向向量精确对齐mesh顶点或共享边，可对射线起点施加微小随机扰动（如1e-7量级）以避开数值奇异点。
3. 验证修复效果可运行新增回归测试用例`RayTest.RayMeshSharedEdge`，该测试复现了共享边漏检现象并在应用补丁后通过。

讨论原作者：@gal-echo-labs 等，版权归原作者所有。
:::

## 原始参考来源 (Sources)

- [GitHub google-deepmind/mujoco #3698：mj_ray misses a ray that passes exactly through a shared edge of a mesh (non-watertight ray-triangle test)](https://github.com/google-deepmind/mujoco/issues/3698)