Як я повинен обробляти крихітні предмети в фізичному двигуні?


13

Я роблю двигун фізики 3D для метання кісток. До цих пір кістки були 1х1х1м, а сила тяжіння 9,82 м / с ^ 2. Звичайно, це не виглядає реалістично, оскільки кубики будуть реагувати на все таким чином, що виглядає трохи повільно.

Щоб виправити це, я спробував просто змінити всі розміри, щоб кістки були приблизно 0,02 м уздовж сторони. Це, в свою чергу, змусило моїх обернених мас і зворотних інерційних матриць отримати дуже великі значення, що призводять до числової нестабільності.

Який найкращий шлях для вирішення цього питання? Чи можу я тримати масштаб так, щоб кістки були 1х1х1 і просто змінювали масу чи розмір діючих сил? Або я повинен підправити щось інше?

Я думаю, що ця проблема може виникнути, якби ви зробили гру з дуже великими фізичними тілами, такими як космічні кораблі чи щось подібне, я сподіваюся, що хтось раніше натрапив на щось подібне.


Я тут не експерт, але, без будь-якого коду, як ми можемо знати, в чому проблема? Я, мабуть, помиляюся, оскільки Box2D має ті самі проблеми.
jcora

1
(Побачивши всі оновлення, мусить бути звичайний спосіб кодування цих речей, і люди, здається, знають, у чому проблема. Думаю, я помилився.)
jcora

1
Так, я думав, що може бути звичайний спосіб впоратися з цим. Як я бачу, це не проблема коду, а скоріше питання з числовою точністю. Те, що я хочу, - це не фрагмент коду для вирішення моєї проблеми, а швидше пояснення підходу до проблеми.
Mikael Högström

Ви маєте на увазі точність з плаваючою точкою?
jcora

У певному сенсі так. Зворотна інерційна матриця, яку я використовую для керування зіткненнями, отримує дуже великі значення. Насправді це не погано обумовлено, оскільки зведені елементи отримують великі значення, і додавання відбувається не так багато, але якось повинна бути проблема з чисельною точністю, оскільки моделювання швидко виходить з-під контролю.
Mikael Högström

Відповіді:


1

Ви можете

  • збільшити постійну гравітації? Ігри часто використовують 2 * 9,81 м / с ^ 2. Не можу згадати, де я це читав, але в іграх зазвичай використовуються нечуттєві одиниці. Які б константи не відчували себе правильними (зробіть гру веселою). Використання реалістичної константи робить фізику здається повільною і плаваючою.
  • запустити моделювання більш швидкою швидкістю. Якщо ви користуєтесь фіксованим часовим кроком, це збільшить швидкість анімації.
  • використовувати поплавці більш високої точності?

Другий момент нічого не робитиме, окрім як зробити симуляцію більш плавною, а може навіть і зламати, якщо симуляція запускається занадто швидко (я не впевнений, чи це реальна проблема, але якщо світ крокує до того, як минув мілісекунд, час різниця завжди була б 0, і нічого не вийшло). Він, можливо, також не захоче витрачати пам'ять на поплавці більшої точності.
jcora

1
Ігри часто використовують подвійну гравітацію? Хто каже?
GameDev-er

Я не можу змінити швидкість або точність, але спробую змінити гравітацію.
Mikael Högström

Зміна постійної сили тяжіння змушує кістки, як правило, рухатися швидше, створюючи враження, що все в меншому масштабі. Це робить поведінку більш хиткою, хоча навіть з мікроколізіями для управління між кадрами прискорення. Напевно, мені просто доведеться його підправити :)
Mikael Högström

4

Якщо у вас виникають проблеми з малими числовими значеннями, я пропоную вам просто все зменшити. Ви можете навіть не використовувати "справжні" вимірювальні одиниці, а лише деякі "загальні" одиниці, які мають сенс усередині двигуна.

Перший варіант зменшення масштабу вимагатиме використання міліметрів або сантиметрів як базової одиниці вимірювання. Тоді розміри вашого куба не зазнають втрати точності.

Друге рішення - це в основному те саме, але тоді вам не потрібно буде думати про фактичні одиниці.

Крім того, чому б вам просто не змінити масу куба?


Оскільки єдиними у мене генераторами сили є сила тяжіння / акселерометр, що змінюється, маса не змінює поведінку. Ваша пропозиція може бути використана навпаки, хоча (можливо, це ви мали на увазі), надаючи дрібним предметам більшу масу, роблячи їх обернені маси ближчим до одного і тим самим зменшуючи числову нестабільність. Це викликає ті самі проблеми, що і лише збільшення постійної сили тяжіння.
Mikael Högström


0

Я думав, що повинен поділитися своїм остаточним рішенням проблеми. Збільшення постійної сили тяжіння, як було запропоновано, дійсно змусило кістки рухатися швидше, створюючи враження правильного масштабу. Це, однак, посилило питання мікрообладнання. Я додав мікроколізії, які пом'якшили проблему, хоча не вирішили її ідеально. Зауважте, що це стає проблемою лише для "малих" об'єктів, якщо у вас виникає зворотний випуск і ви хочете імітувати дуже великі об'єкти (космічні кораблі чи щось подібне), то у вас взагалі не виникне жодних проблем з мікробукером і можна зіткнутися з це рішення.

Тож я виявив найвищий рівень тяжкості, який я міг мати, не отримуючи занадто сильного "мікроскоку". Потім я застосував на телефоні просте детектування тремтіння, яке реагувало на великі зміни від показань акселерометра і застосовувало імпульси до всіх об'єктів, коли такі струси виявлені. Це не ідеально, але так як це дозволить кісткам рухатися швидко, коли телефон похитнеться, він створить враження "крихітних" кісток. Це трохи хак, але це доведеться робити :) Ось кліп двигуна в дії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.