Как мне обращаться с крошечными объектами в физическом движке?

13

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

Чтобы исправить это, я попытался просто изменить все размеры, чтобы кости были около 0,02 м вдоль стороны. Это, в свою очередь, заставило мои обратные массы и матрицы обратной инерции получить очень большие значения, которые приводят к численной нестабильности.

Какой лучший способ справиться с этим? Могу ли я увеличить масштаб так, чтобы кости были 1x1x1, и просто изменить массу или размер действующих сил? Или я должен настроить что-то еще?

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

Микаэль Хегстрём
источник
Я не эксперт здесь, но без кода, как мы можем узнать, в чем проблема? Я, вероятно, ошибаюсь, так как Box2D имеет те же проблемы.
Jcora
1
(Видя все отрицательные стороны, должен быть общепринятый способ кодирования этих вещей, и люди, кажется, знают, в чем ваша проблема. Думаю, я ошибался.)
jcora
1
Да, я думал, что может быть обычный способ справиться с этим. На мой взгляд, это не проблема кода, а проблема с числовой точностью. То, что мне нужно, это не фрагмент кода для решения моей проблемы, а скорее объяснение подхода к проблеме.
Микаэль Хогстрем
Вы имеете в виду точность с плавающей точкой?
Jcora
В некотором смысле, да. Обратная матрица инерции, которую я использую при обработке столкновений, получает очень большие значения. На самом деле это не плохо обусловлено, поскольку сводные элементы получают большие значения, и не происходит большого сложения, но каким-то образом должна быть проблема с числовой точностью, поскольку моделирование быстро выходит из-под контроля.
Микаэль Хогстрём,

Ответы:

1

Вы могли бы

  • увеличить гравитационную постоянную? Игры часто используют 2 * 9,81 м / с ^ 2. Не могу вспомнить, где я это читал, но игры обычно используют бессмысленные единицы. Какие бы константы ни казались правильными (сделайте игру веселой). Использование реалистичной константы делает физику медленной и плавной.
  • запустить симуляцию с большей скоростью. Если вы используете фиксированный временной шаг, это увеличит скорость анимации.
  • использовать более точные поплавки?
torbjoernwh
источник
Вторая точка ничего не сделает, кроме как сделать симуляцию более плавной, или, может быть, даже сломать ее, если симуляция выполняется слишком быстро (я не уверен, что это реалистичная проблема, но если мир шагнет до того, как пройдет миллисекунда, время Разница всегда будет 0, и ничего не будет работать). Возможно, он не захочет тратить память на поплавки высокой точности.
Jcora
1
Игры часто используют двойную гравитацию? Говорит кто?
GameDev-er
Я не могу изменить скорость или точность, но я попытаюсь изменить гравитацию.
Микаэль Хогстрем
Изменение гравитационной постоянной заставляет кости, как правило, двигаться быстрее, создавая впечатление, что все в меньшем масштабе. Это делает поведение более нервным даже при использовании микроколлизий для обработки межкадрового ускорения. Думаю, мне просто нужно это настроить :)
Mikael Högström
4

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

Первый вариант, уменьшающий масштаб, потребует использования миллиметров или сантиметров в качестве базовой единицы измерения. Размеры вашего куба не пострадают от потери точности.

Второе решение в основном то же самое, но тогда вам не нужно думать о реальных единицах.

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

jcora
источник
Поскольку единственные генераторы силы, которые у меня есть, это изменение массы, основанное на гравитации / акселерометре, это не меняет поведение. Ваше предложение может быть использовано наоборот, хотя (может быть, это то, что вы имели в виду), давая маленьким объектам большую массу, делая их обратные массы ближе к единице и, таким образом, уменьшая численную нестабильность. Это дает те же проблемы, что и увеличение постоянной гравитации.
Микаэль Хогстрем
0

Я подумал, что должен поделиться своим окончательным решением проблемы. Увеличение постоянной силы тяжести, как это было предложено, действительно заставляло кости двигаться быстрее, создавая впечатление правильного масштаба. Это, однако, усилило проблемы микропрыгивания. Я добавил микроколлизии, которые уменьшили проблему, но не решили ее полностью. Обратите внимание, что это становится проблемой только для «маленьких» объектов, если у вас возникла обратная проблема и вы хотите смоделировать очень большие объекты (космические корабли или что-то в этом роде), тогда у вас не будет никаких проблем с микропрыгиванием, и вы можете бороться с это решение.

Таким образом, я нашел самый высокий уровень гравитации, который мог иметь, не получая слишком много "микропрыгивания". Затем я использовал простое обнаружение сотрясений на телефоне, которое реагировало на большие изменения показаний акселерометра и прикладывало импульсы ко всем объектам при обнаружении таких сотрясений. Он не идеален, но поскольку он заставит кости двигаться быстро, когда телефон встряхнут, это создаст впечатление «крошечных» игральных костей. Это что-то вроде взлома, но с этим придется сойтись :) Вот ролик движка в действии.

Микаэль Хегстрём
источник