求助,关于射线检测碰撞点的疑问

我使用射线检测台球的前进方向上是否与其他球发生碰撞,在返回的结果中有台球碰撞,但是碰撞点不在台球上而在远处的球桌位置,请问这是为啥,按照道理来说,发生了碰撞那么碰撞点应该在碰撞体的节点上啊,怎么会在其他位置。

   public ray(pos: Vec3, dir: Vec3, mask: number) {
       //射线发射
      const outRay = new geometry.Ray(pos.x, pos.y, pos.z, dir.x, dir.y, dir.z);
      const maxDistance = 100;
      const queryTrigger = true;

      const bResult = PhysicsSystem.instance.raycastClosest(outRay, mask, maxDistance, queryTrigger);
      if (bResult) {
      const results = PhysicsSystem.instance.raycastClosestResult;
      return {
         collider: results.collider,
         distance: results.distance,
         hitNormal: results.hitNormal,
         hitPoint: results.hitPoint,
         node: results.collider.node,
     }
   }
  return null;
}

上面是我使用的检测方法,按照正常情况hitPoint应该是results.collider.node附近的位置的,为什么在远处的球桌位置

检查一下所有碰撞点。一般来说会返回很多碰撞点,你需要拿到最近的那一个,或者设置射线的长度

const results = PhysicsSystem.instance.raycastClosestResult;这里不就是最近的那个么,我是拿的这个结果的数据的,他的碰撞体和碰撞点不在一起

不敢苟同,有一阵子没做3d了,你看下吧。一般来说碰撞是可以拿到所有的碰撞点,然后通过距离比例排序的。你查一下。坑不会很多

我是不是可以理解,这个方法返回的是离射线最近的碰撞体,但是碰撞点并不是与这个最近的碰撞体发生碰撞的点

没用过这个接口,我不知道是不是最近的。你可以使用常规射线检测试试

好的,我试试

image 一般来说,这种写法用的多一点。你这个写法我也看到了

但是我是没用过这个接口,不知道有没有啥坑啥的。你可以用图1这种更常规的写法验证下。

我把结果打印出来,发现同一个距离下的结果,hitPoint和hitNormal竟然不一样,我还是选第一个方法自己筛最小距离的吧

看过源码,我印象里面返回的点是不会排序的。因为底层数据结构的原因,返回的点是无序的。一般是拿到所有碰撞点,然后排序筛你要的结果。2d3d都一样

嗯,第二种方法下拿到的结果跟第一种方法拿到的结果,相同距离下的数据,碰撞点和碰撞法线不一致,我用第一种方法自己筛选了