bullet 物理系统对象设置dynamic,射线检测就无效

var r: geometry.Ray = geometry.Ray.create(0, 0, 0, 0, 0, -1);

    //两种模式, 碰到物体就停止

    if (PhysicsSystem.instance.raycastClosest(r)) {

        let result: PhysicsRayResult = PhysicsSystem.instance.raycastClosestResult;

        console.log("raycastClosestResult", result);

    }

代码就这么简单, 物体只要设置成dynamic就返回不了结果, 更换物理引擎, 或者更换物体的为静态或者运动学就是好的, 这个BUG 已经存在3年了, 还不修复嘛?

只能自己撸一个了 :thinking:

:astonished: 我这边用raycastClosest测试了下,是可以检测到的呀。是不是有什么前提条件弄错了。还是我这边没弄对。

检测不到, 你看看你的物理设置是不是bullet引擎, 另外2个是可以检测到的, 目标物要dymaic

物理检测,不用cocos的。

上测试包吧

:hushed: 我用的就是bullet,刚体也是dynamic的类型。ray是用的相机 screenPointToRay 获取的。 确实可以检测的到。

Test3D.zip (28.1 KB) 不是相机, 我是直接发射一条射线

Test3D.zip (28.1 KB) 很空旷,直接放一个物体, 代码生成一条射线碰撞, 切换物理引擎版本就不一样

:smiley: 我测试出来了。感觉是引擎的bug,或者说是里面的脚本调用顺序问题导致的。
如果你的射线和你的对象,同时出现。刚体为DYNAMIC类型的就检测不到了。
需要延迟一帧再做检测,或者是对象先存在后再检测,就能检测出来了。(一定要对象出现和射线检测不同时发生)。只有bullet会这个情况,其他的没有出现。
我是用的点击屏幕做射线检测的,所以不会出现这种bug… 不愧是creator。总有意想不到的坑 :sob:

1赞

嗯,我再多做了几次严谨性的测试。刚体的类型都为dynamic,其它的类型都能检测到。

  1. 对象自带碰撞体组件,不带刚体组件。 结果: 能检测到。
  2. 对象自带碰撞体组件和刚体组件。 结果:需要下一帧才能检测到。
  3. 使用脚本动态加载碰撞体和刚体组件。 结果:能检测到。
  4. 设置对象的active默认为false是否有影响。结果:没影响,和123一致。
  5. 把对象作为预制体加载是否有影响。结果:没影响,和123一致。

:thinking: 所以我验证到的结论是“ 自带刚体组件的对象,如果采用的是bullet物理引擎,且类型为dynamic的话。在场景上生成的同帧内,射线检测是检测不到的。 如果刚体组件是通过脚本addCompent动态加载出来的话就可以检测的到。 ”

:pensive: 还得是creator,小细节上狠狠拿捏我们。

1赞

是吧, 而且这个bug论坛里我搜索到, 2023年就有人反馈了 官方说会修复的,结果3年了还在, 完全就搁置了

1赞

时序导致的,static不需要物理变化,首场经挂载就生效,但是dynamic首场景会先挂载刚体、初始化物理信息等,在postUpdate才会调用syncSceneToPhysics同步物理世界。要手动避免这个问题可以在检测前强制同步物理世界

2赞