Как я могу реально смоделировать удар по мячу с помощью физики Bullet? (Живое демо включено)
Фон
Я играю в создание игры в мини-гольф с использованием three.js и преобразования ammo.js из библиотеки Bullet Physics, но у меня возникают некоторые проблемы с реалистичным движением мяча.
(Я разместил демо на http://penguinspuzzle.appspot.com/minigolf.html если вы хотите посмотреть, как это работает на практике.)
Вопрос
Какой хороший алгоритм дает более реалистичное движение мяча для мини-гольфа?
Что я пробовал
В ammo.js есть опции для трения, линейного демпфирования и демпфирования вращения.
Когда шарик катится, настройка трения, кажется, не имеет большого эффекта.
Я сейчас пользуюсь
body.setRestitution(0.8);
body.setFriction(1);
body.setDamping(0.2,0.1); // linear damping, rotational damping
Проблемы
При высоких значениях линейного демпфирования шар, кажется, замедляется слишком быстро.
С более низкими значениями, кажется, требуются годы, чтобы наконец остановиться.
Когда мяч находится в воздухе, кажется неразумным применять линейное демпфирование вообще.
Анализ
Я думаю, что проблема может быть в линейном затухании в ammo.js, которое вызывает экспоненциальное замедление.
Я старался:
- Запись видео удара гольфа
- Измерение местоположения мяча в каждом кадре
- Построение местоположения и скорости мяча в зависимости от времени
Результаты показаны ниже. Мне кажется, профиль скорости гораздо ближе к линейному, чем к экспоненциальному.
Любые предложения для алгоритма, чтобы получить ammo.js быть более реалистичным?
1 ответ
Я заметил, что вы используете "обычное" трение на сферическом объекте. В физике существует отдельное понятие "трение качения" для круглых объектов. Я не знаю, предоставляет ли Bullet Physics такую концепцию в своем API. Если это так, попробуйте заменить это на аналог трения качения:
body.setFriction(1);