cocos / cocos-engine

Cocos simplifies game creation and distribution with Cocos Creator, a free, open-source, cross-platform game engine. Empowering millions of developers to create high-performance, engaging 2D/3D games and instant web entertainment.
https://www.cocos.com/en/creator
Other
8.21k stars 1.94k forks source link

Bullet 缺少ccClosestConvexResultCallback.getClosestHitFraction导出 #17672

Closed 06wj closed 2 weeks ago

06wj commented 1 month ago

Cocos Creator version

3.5.0

System information

mac

Issue description

cocos bullet库中,c++中的ccClosestConvexResultCallback.getClosestHitFraction没有导出到wasm,sweepTest需要这个信息判断sweep的精确位置

https://github.com/cocos/cocos-ammo.js/blob/a9191a7992460e7fa37a9bd46d08b5eb8898cbfc/bullet/src/extensions/ccConvexCastCallBack.h#L71

Relevant error log output

No response

Steps to reproduce

no need

Minimal reproduction project

No response

minggo commented 2 weeks ago

这些导出是给引擎内部用的。现在导出的都是类似 ccClosestConvexCallback_getCollisionShapePtr 这样的接口,你是直接调用这样的接口?

06wj commented 2 weeks ago

https://github.com/cocos/cocos-engine/blob/2ec9087a8969164c51358b37d287736947de8190/cocos/physics/bullet/bullet-world.ts#L440

主要原因是现在引擎的 sweepClosest 只有normal和position,没有返回这个 HitFraction 信息,我想改下发现 bullet 里没有给 wasm 导出这个接口。 需要这个信息是因为我想知道 sweep 发生碰撞时,sweep的真正位置。 sweepPosition.lerpVectors(worldRay.origin, worldRay.end, hitFraction);

minggo commented 2 weeks ago

现在的 PhysicsRayResult 是没有 HitFraction。你是想在 PhysicsRayResult 加入 HitFraction 吗?你打算怎么改呢?

minggo commented 2 weeks ago

我是可以加接口获取 HitFraction。

06wj commented 2 weeks ago

现在的 PhysicsRayResult 是没有 HitFraction。你是想在 PhysicsRayResult 加入 HitFraction 吗?你打算怎么改呢?

是的,result 里加 HitFraction 或者 直接加算好的 sweepPosition 都可以

minggo commented 2 weeks ago

但不是所有的 result 都有 HitFraction 吧?

06wj commented 2 weeks ago

但不是所有的 result 都有 HitFraction 吧?

raycast 类的应该都有

minggo commented 2 weeks ago

上面的 PR 修复了这个问题。你可以试一下,不过得更新下第三方库:https://github.com/cocos/cocos-engine-external/pull/462

minggo commented 2 weeks ago

cannon.js, builtin 和 physx 都没有类似的字段。所以没法加这个。

06wj commented 2 weeks ago
  1. 对于 raycast,HitFraction可以用过 distance/maxDistance 算出

  2. 对于 sweep,cocos 的实现

    1. bullet 下是 sweep start position 与 碰撞点 的距离
    2. physx 下是 sweep start position 与 sweep end position 的距离 https://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/guide/Manual/GeometryQueries.html image 这种 HitFraction 也是可以通过 distance/maxDistance 算出,其实我觉得这种 distance 更符合预期,如果统一成这样我也不需要 hit fraction 信息了。 sweep start position 与 碰撞点的距离可以自己算出的。
minggo commented 2 weeks ago

PhysicsRayResult 的返回值有 distance,而 max distance 是传入的值。那你的需求是什么呢?

06wj commented 2 weeks ago

PhysicsRayResult 的返回值有 distance,而 max distance 是传入的值。那你的需求是什么呢?

sweep时,distance应该代表sweep start position 与 碰撞点距离还是sweep start position 与 sweep end position 的距离,如果是后者我就不需要 HitFraction,如果前者我就需要

现在看起来 cocos 的实现没统一

minggo commented 2 weeks ago

distance应该代表sweep start position 与 碰撞点距离还是sweep start position 与 sweep end position 的距离

如果发生碰撞,那么 sweep end position 和碰撞点一致。如果是没发生碰撞,那么没有碰撞点,sweep end position 和 max distance 一致。

你的意思是没有发生碰撞时,distance 出问题了?

06wj commented 2 weeks ago

distance应该代表sweep start position 与 碰撞点距离还是sweep start position 与 sweep end position 的距离

如果发生碰撞,那么 sweep end position 和碰撞点一致。如果是没发生碰撞,那么没有碰撞点,sweep end position 和 max distance 一致。

你的意思是没有发生碰撞时,distance 出问题了?

image

看这张图,红线是和sweep end position 的 distance,绿线是和碰撞点的distance

我的需求其实就是想要红色线的终点的位置,bullet上的我测试过现在满足需求了

minggo commented 2 weeks ago

但不是所有的物理引擎都提供这个值。可能得改成可选变量。