Ответ: [TrueHorror] - разработка
На самом деле Bullet очень устойчивый движок, даже когда я намеренно пытался вывести из равновесия, никаких взрывов сцены или улетающих в небо объектов не было.
В общем что-то похожее как у тебя получилось сделать с функцией btDiscreteDynamicsWorld::stepSimulation.
Там три параметра (два можно оставить по умолчанию).
Первый это дельта-время, то сколько прошло с прошлого вызова (то есть сколько нужно обработать), третий параметр это время минимального шага, а второй это предел количества разрешённых минимальных шагов, в случае если дельта-время будет больше обычного значения.
Например если у игры 60fps можно сделать так:
deltaTime = 1.0f / 60.0f;
stepSimulation( deltaTime, 4, 1.0f / 60.0f );
В данном случае будет один шаг, т. к. он равен дельта-времени.
А вот в случае если по каким-то причинам игра подзастряла на 3 кадра и получилось:
deltaTime = 3.0f * 1.0f / 60.0f;
теперь при вызове
stepSimulation( deltaTime, 4, 1.0f / 60.0f );
будет вызвано три шага.
А вот в случае если игра подзастрянет на 10 кадров, то всё равно больше 4 функция не обработает -- таким образом не произойдет большого неконтролируемого интервала.
Визуально это будет выглядеть как пауза, а не исчезнувший большой кусок времени.
Ну так вот, а если deltaTime будет меньше минимального шага:
deltaTime = 1.0f / 120.0f
stepSimulation( deltaTime, 4, 1.0f / 60.0f );
то начинаются как раз такие глюки с подпрыгиванием.
В общем ставить шаг точно равный fps тоже имхо не надежно, я делаю за кадр 2 шага.
deltaTime ~ 1.0f / 60.0f (то есть может немного гулять).
stepSimulation( deltaTime, 4, 1.0f / 120.0f );
Особых негативных последствий для производительности я не заметил, хотя у меня пока нет таких больших локаций как у тебя и стресс-тестов я не проводил.
Можно вообще отсоединить физику от реального времени:
stepSimulation( 1.0f / 60.0f, 1, 1.0f / 60.0f );
Тогда раз всё ровно, можно попробовать обойтись одним шагом.
Скорость игры будет зависеть от FPS (что тоже не плохо, если графический движок плавно адаптирует сложность графики и FPS не скачет).
Если ты делаешь безлимитный FPS то соответственно шаги придется при необходимости делать ещё меньше, чтобы умещались в deltaTime.
Пока это одна из причин пригания объектов, может есть и другие...
|