0

我有以下问题:我想使用子弹物理来移动角色。到目前为止,我在跳跃时遇到了一个严重的问题:如果我摔倒在地,身体(角色)会沉入地面几毫秒。他跌得越久,他就越沉。我使用 20 的重力、圆柱形状和睡眠阈值为 0,0 的地平面。有没有什么办法解决这一问题?

4

1 回答 1

1

听起来您的对象在每个模拟步骤中移动得太快。这样做的结果可能导致两个物体过度穿透。在提供的字符控制器代码的情况下,调用recoverFromPenetration 将导致碰撞的对象向后移动(向后定义为根据穿透多边形的法线计算)直到它不再穿透。

void btKinematicCharacterController::preStep (  btCollisionWorld* collisionWorld)
{

        int numPenetrationLoops = 0;
        m_touchingContact = false;
        while (recoverFromPenetration (collisionWorld))
        {
                numPenetrationLoops++;
                m_touchingContact = true;
                if (numPenetrationLoops > 4)
                {
                        //printf("character could not recover from penetration = %d\n", numPenetrationLoops);
                        break;
                }
        }

        m_currentPosition = m_ghostObject->getWorldTransform().getOrigin();
        m_targetPosition = m_currentPosition;
//      printf("m_targetPosition=%f,%f,%f\n",m_targetPosition[0],m_targetPosition[1],m_targetPosition[2]);


}

它尝试执行此操作 4 次,如果它不能解决穿透问题,则恢复代码将失败并终止,对象仍在相互穿透。此控制器代码并非旨在成为生产代码,而是进一步定制和开发的起点和框架。它很好地发挥了它的作用,但正如您所发现的那样,它存在局限性。

于 2014-03-19T03:04:28.747 回答