请教一下物理引擎的碰撞问题,突然卡死,不报错,不报异常

理论上来说,小球碰到边缘的刚体就会反弹,但是经常出现小球碰到边缘然后就卡死了,不报错,不报异常!!发生卡死的时候浏览器网页也卡死了,而且连碰撞回调也没有走。。。。
有大佬知道这是个什么问题吗?

1赞

死循环了吧

问题是也没下对应的循坏逻辑啊

最近升到2.0.10也是这样,用物理引擎经常卡死,只能强制重启浏览器

卡死是进入死循环了啊,就是说球的边缘不止是碰到挡板,而是撞进去,由于刚体在球内部始终处于“接触”状态,反复反弹。

b2World.prototype.SolveTOI = function (step) {
            // b2Island island(2 * b2_maxTOIContacts, b2_maxTOIContacts, 0, &m_stackAllocator, m_contactManager.m_contactListener);
            var island = this.m_island;
            island.Initialize(2 * b2_maxTOIContacts, b2_maxTOIContacts, 0, null, this.m_contactManager.m_contactListener);
            if (this.m_stepComplete) {
                for (var b = this.m_bodyList; b; b = b.m_next) {
                    b.m_islandFlag = false;
                    b.m_sweep.alpha0 = 0;
                }
                for (var c = this.m_contactManager.m_contactList; c; c = c.m_next) {
                    // Invalidate TOI
                    c.m_toiFlag = false;
                    c.m_islandFlag = false;
                    c.m_toiCount = 0;
                    c.m_toi = 1;
                }
            }

断点看,是卡死在上面这个for循环跳不出来了

那这得怎么搞~~

查一下是否游戏运行中改了刚体组件的scale或者大小?

应该没有

怎么解决的,我也遇到了这个问题?

把自己逻辑放在onPostSolve上处理,不要放在onBeginContact或是onEndContact 避免影响物理引擎逻辑。基本上就不会报错了

试一下 隔帧处理

碰撞之后 在下一帧修改属性 开个执行一次 0秒的定时器

很有用,不需要改引擎就避免了物理引擎内的问题,我是在 onEndContact 内修改了另一个碰撞体的分组,发现把逻辑放在 onBeginContact 中或者把 函数放在最后帧执行就没问题了,不过还是放在最后帧执行比较好,避免影响box2d

mark~

这个也影响吗?我经常这样干 :sweat_smile: