You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用Webpack运行PhysX-JS时碰撞失效、物体穿透地面问题求助

问题原因及修复方案

核心问题点

  • 动态刚体未配置质量:你创建RigidDynamic实例后没有设置质量,PhysX默认动态刚体质量为0,不会触发正常的碰撞结算,这是物体穿透地面的核心原因。
  • 薄地面+无CCD导致碰撞漏判:你的地面厚度仅0.1,物理碰撞半高只有0.05,物体下落速度较快时,离散碰撞检测会在两帧之间直接跳过碰撞判定,导致穿透。
  • 拼写错误隐患:球体类型判断写为spehre(正确为sphere),Physx大小写错误(正确为PhysX),当前未用到球体不影响运行,但后续扩展会直接触发报错。
  • 碰撞回调未开触发开关:你仅实现了回调实例,但没有在场景配置、shape标志中开启接触报告开关,所以回调函数不会被触发。

具体修改代码

  1. 给动态刚体设置质量,可选开启CCD防穿透
    找到init函数中创建动态刚体的部分,添加如下代码:
if (entity.body.dynamic) {
  body = physics.createRigidDynamic(transform)
  // 新增:设置质量为1kg,自动计算惯性张量
  body.updateMassAndInertia(1)
  // 可选:开启刚体CCD,避免高速运动时穿透
  body.setRigidBodyFlag(PhysX.PxRigidBodyFlag.eENABLE_CCD, true)
}
  1. 开启场景全局CCD支持
    找到setup函数中创建场景的部分,添加如下代码:
scene = physics.createScene(sceneDesc)
// 新增:开启场景CCD支持
scene.setFlag(PhysX.PxSceneFlag.eENABLE_CCD, true)
  1. 修正拼写错误
    将球体分支的代码修正为:
if (entity.body.type === 'sphere') {
  geometry = new PhysX.PxSphereGeometry(...entity.body.size)
}
  1. 如需触发碰撞回调,添加开关
    创建shape的标志位添加触发标识:
const flags = new PhysX.PxShapeFlags(
  PhysX.PxShapeFlag.eSCENE_QUERY_SHAPE.value |
  PhysX.PxShapeFlag.eSIMULATION_SHAPE.value |
  // 新增:开启触发形状标识
  PhysX.PxShapeFlag.eTRIGGER_SHAPE.value
)

同时在创建场景描述后添加接触报告开关:

sceneDesc.flags |= PhysX.PxSceneFlag.eENABLE_ACTIVE_ACTORS.value

修改完成后即可正常触发碰撞,物体不会穿透地面。


内容的提问来源于stack exchange,提问作者B''H Bi'ezras -- Boruch Hashem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:12:00