Конгер Д.
Физика для разработчиков компьютерных игр
стр. 307

Замечание

Заметьте, что функция UpdateFrame () теперь не уменьшает до нуля импульсные силы, как это делалось в главе 10. Теперь это делает метод ri-gid_body::Update().

Запустив программу, вы заметите, что шарики (тигры) перемещаются и сталкиваются почти так же, как и в главе 10, но теперь на них действует сила тяжести, и они падают на поверхность земли. Ударяясь об эту поверхность, они отскакивают от нее в соответствии с их коэффициентами восстановления. Если вы не измените коэффициенты восстановления шариков, шарики будут подскакивать все слабее и слабее после каждого столкновения. Постепенно они выкатятся за пределы области видимости.

Качение

На самом деле в этой программе качение объектов по поверхности не моделируется. Вспомните, программа проверяет, соприкасаются ли шарики с поверхностью земли. Если да, программа немного смещает их, чтобы при следующей итерации моделирования не было обнаружено столкновение. Проще говоря, если объект соприкасается с поверхностью земли, программа предполагает, что этот объект от нее отскакивает. Однако высота отскока будет так мала, что игрок этого отскока просто не заметит. Ему покажется, что шарики просто катятся по поверхности. Так что все в порядке, верно?

Ну, это зависит от вашей точки зрения. Если объекты катятся по земле, то эта программа обнаруживает столкновение на каждой итерации моделирования и реагирует на это столкновение. Реакция требует незначительных накладных расходов, и ее можно игнорировать.

Однако если вы не хотите игнорировать эту проблему, есть несколько способов ее решения. Первый способ - программный.

Если объект катится по горизонтальной поверхности, то его скорость по оси у должна быть практически нулевой. Если скорость объекта близка к 0, то не нужно заставлять его подскакивать. Но этот способ не будет работать, если объект катится по склону, поскольку его скорость по оси у будет отлична от нуля.

Второй способ - сочетание программного и физического. Добавьте в класс rigid_body элемент данных, отслеживающий местоположение объекта в предыдущей итерации моделирования, или просто сохраняйте резервную копию объекта, к которой можно будет обратиться на следующей итерации, как в методе HandleOverlapping (). Используя предыдущее местоположение, высоту поверхности и формулу F = mg, вычислите силу соударения. Если сила практически нулевая, значит, объект катится, а не подскакивает - его нужно просто перемещать соответственно его линейной скорости.

Новости
Косплей Сенуя из Hellblade: Senua’s Sacrifice
Редакция Геймбокса не могла не поделиться с вами прекрасным отечественным косплеем на Сенуя из Hellblade: Senua's Sacrifice.
Bethesda подала в суд на Warner Bros. за Westworld
Как утверждает издание TMZ, компания Bethesda Softworks подала в суд на кинокомпанию Warner Bros. и студию Behaviour Interactive.