Bullet物理引擎角色控制器穿透静态与动态物体的问题求助
Bullet物理引擎角色控制器穿透静态与动态物体的问题求助
大家好,我在基于Ammo.js使用Bullet物理引擎实现角色控制器的时候,碰到了一个特别矛盾的问题,折腾好几天没搞定,来请教下各位大佬:
我的核心问题是:角色控制器不会站在静态物体的表面,而是会直接陷进去,这带来了很多不符合预期的表现,但诡异的是,角色上台阶的功能却是正常的!
我还发现一个奇怪的现象:如果我把角色控制器初始化时的upAxis参数设为-1,角色就能正常贴合在物体表面上了,但这时候上台阶的功能就完全失效了...
下面是我相关的代码片段,方便大家排查问题:
角色控制器(Character Controller)初始化代码
// 1. 创建Ghost Object作为角色的碰撞体容器 let body = new AMMO.btPairCachingGhostObject(); body.setWorldTransform(transform); body.setCollisionShape(colShape); // 禁用休眠状态 body.setActivationState(4); // DISABLE_DEACTIVATION == 4 body.activate(true); this.world.getBroadphase().getOverlappingPairCache().setInternalGhostPairCallback(new AMMO.btGhostPairCallback()); // 标记为角色对象 body.setCollisionFlags(body.getCollisionFlags() | btCollisionObjectCollisionFlags.CF_CHARACTER_OBJECT); // 16 this.world.addCollisionObject(body); // 2. 创建角色的圆柱碰撞形状 let collider = new AMMO.btCylinderShape( new AMMO.btVector3(metadata.params.radius, metadata.params.halfHeight, metadata.params.radius) ); // 3. 创建Kinematic角色控制器 let characterController = new AMMO.btKinematicCharacterController( body, collider, 0.35, // stepHeight 台阶高度 1 // upAxis 原参数为1,改为-1时表面贴合正常但台阶功能失效 ); characterController.setUseGhostSweepTest(true); characterController.setGravity(9.8 * 3); // 重力设为默认的3倍 characterController.setMaxSlope(Math.PI / 3); // 最大爬坡角度设为60度(默认45度) this.world.addAction(characterController);
地面静态物体初始化代码
let mass = 0; // 质量为0标记为静态物体 let motionState = new AMMO.btDefaultMotionState(transform); let rbInfo = new AMMO.btRigidBodyConstructionInfo(mass, motionState, colShape, localInertia); body = new AMMO.btRigidBody(rbInfo); this.world.addRigidBody(body); // 设置为静态物体碰撞标记 body.setCollisionFlags(body.getCollisionFlags() | btCollisionObjectCollisionFlags.CF_STATIC_OBJECT); // 1
还有几个细节可能对排查问题有帮助:
- 穿透现象只发生在角色控制器的下半部分,从侧面观察的话,角色和物体的侧面碰撞是正常贴合的
- 场景中的动态物体也存在同样问题:从侧面推它们时,碰撞交互完全正常,但站在它们上面就会出现穿透
如果我的问题描述有不清楚的地方,或者需要补充其他调试信息,欢迎大家随时指出,我会马上补充说明!
内容来源于stack exchange
相关产品推荐
相关产品推荐

