我有以下问题:我想使用子弹物理来移动角色。到目前为止,我有一个严重的跳跃问题:如果我倒在地上,身体(角色)会沉入地下几毫秒。他跌倒的时间越长,他下沉的越多。我使用20的重力,圆柱形和一个睡眠阈值为0,0的地平面。有没有办法解决这个问题?
答案 0 :(得分: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次,如果它不能解决渗透,则恢复代码将失败并终止,对象仍然相互渗透。此控制器代码不是生产代码,而是进一步定制和开发的起点和框架。它很好地服务于它的目的但是你发现它有局限性。