Threejs Ammojs Collision Detection Not Working

Hi all
I am facing a challenge with implementing collision detection between a first-person camera character and a glTF model.

I think problem is const numManifolds = dispatcher.getNumManifolds();
numManifolds will return 0

Here is my codes (not all codes)

function initPhysicsUniverse() {

    var collisionConfiguration = new Ammo.btDefaultCollisionConfiguration();
    var dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration);
    var broadphase = new Ammo.btDbvtBroadphase();
    var solver = new Ammo.btSequentialImpulseConstraintSolver();

    physicsWorld = new Ammo.btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
    physicsWorld.setGravity(new Ammo.btVector3(0, -10, 0));

}


function initAmmoJsKinematicCharacterController() {

    const radius = 1;
    const height = 3;

    let transform = new Ammo.btTransform();
    transform.setIdentity();
    transform.setOrigin(new Ammo.btVector3(1, 3, 1));
    transform.setRotation(new Ammo.btQuaternion(1, 1, 1, 1));

    let shape = new Ammo.btCapsuleShape(radius, height);
    shape.setMargin(0.05);

    bodyCapsuleShape = new Ammo.btPairCachingGhostObject();
    bodyCapsuleShape.setWorldTransform(transform);
    bodyCapsuleShape.setCollisionShape(shape);
    bodyCapsuleShape.setCollisionFlags(flags.CF_CHARACTER_OBJECT);
    bodyCapsuleShape.activate(true);

    kinematicCharacterController = new Ammo.btKinematicCharacterController(bodyCapsuleShape, shape, 0.35, 1);
    kinematicCharacterController.setUseGhostSweepTest(true);
    kinematicCharacterController.setUpInterpolate();
    kinematicCharacterController.setGravity(GRAVITY);
    kinematicCharacterController.setMaxSlope(Math.PI / 3);
    kinematicCharacterController.canJump(true);
    kinematicCharacterController.setJumpSpeed(GRAVITY / 3);
    kinematicCharacterController.setMaxJumpHeight(100);
    let userData_ = new Ammo.btVector3(0, 0, 0);

    const userData = { name: "player" };

    userData_.userData = userData;
    bodyCapsuleShape.setUserPointer(userData_);

    tmpVec3_ = new Ammo.btVector3(0, 0, 0);

    physicsWorld.addCollisionObject(bodyCapsuleShape);
    physicsWorld.addAction(kinematicCharacterController);

    physicsWorld.getBroadphase().getOverlappingPairCache().setInternalGhostPairCallback(new Ammo.btGhostPairCallback())


}

function addGltfToScene() {

    scene_.add(gltfModel.scene);

    gltfModel.scene.traverse(element => {

        if (element.isMesh) {
            createGltfRigidBodyAsBox(element, element.position, element.quaternion, element.scale);
        }

    })
}


function createGltfRigidBodyAsBox(model, position, quaternion, size) {

    let transform = new Ammo.btTransform();
    transform.setIdentity();
    transform.setOrigin(new Ammo.btVector3(position.x, position.y, position.z));
    transform.setRotation(new Ammo.btQuaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w));

    let motionState = new Ammo.btDefaultMotionState(transform);

    let btSize = new Ammo.btVector3(size.x, size.y, size.z);
    let shape = new Ammo.btBoxShape(btSize);
    shape.setMargin(0.05);

    let inertia = new Ammo.btVector3(0, 0, 0);
    shape.calculateLocalInertia(0, inertia);

    let info = new Ammo.btRigidBodyConstructionInfo(10, motionState, shape, inertia);
    let rigidBody = new Ammo.btRigidBody(info);

    const userData = { name: model.name };
    var userData_ = new Ammo.btVector3(0, 0, 0);
    userData_.userData = userData;
    rigidBody.setUserPointer(userData_);

    rigidBody.setActivationState(4);
    rigidBody.setCollisionFlags(2);

    model.userData.physicsBody = rigidBody;

    physicsWorld.addRigidBody(rigidBody);

    /*Ammo.destroy(btSize);*/
}

function updatePhysicsUniverse(timeElapsedS) {

    physicsWorld.stepSimulation(timeElapsedS, 10);

    
}