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

Наиболее сложен случай с перекрытием ограничивающих сфер. В этом случае функция UpdateFrame () вызывает функцию Handl eOve г lapping (). Код функции HandleOverlappingO приведен в строках 96-216 листинга 10.5.

Функция HandleOverlappingO исправляет столкновения с перекрытием, выполняя шаги обратно во времени игры. В строках 122-142 листинга 10.5 она меняет на обратные направления векторов сил, линейных и угловых скоростей, действующих на оба перекрывающихся объекта. Затем выполняется обновление данных в обоих объектах. Эффект от этих действий эквивалентен возврату во времени в момент до столкновения.

В строке 149 функция HandleOverlapping О делит пополам временной шаг. Строки 154-173 восстанавливают исходные направления сил, линейных и угловых скоростей обоих тел. Затем выполняется обновление, и функция HandleOverlappingO проверяет, произошло ли столкновение (строки 183-184). Затем исполнение продолжается со строки 109, с которой начинается цикл for. Оператор switch, начинающийся в строке 114, опять определяет реакцию на столкновение. Если возврат назад во времени приводит к тому, что объекты соприкасаются, функция HandleOverlappingO вычисляет силы, возникающие при столкновении, и завершает цикл. Если тела все еще перекрываются, HandleOver-lapping() еще раз выполняет возврат во времени, уменьшает вдвое временной шаг и повторяет все снова. Это повторяется до тех пор, пока тела будут только соприкасаться, но не перекрываться.

Возможно, в результате возврата тела переместятся назад слишком далеко. В этом случае столкновения не будет, и нужно будет двигаться вперед во времени до тех пор, пока тела не соприкоснуться. Это делает код в строках 196-204.

После того, как функция HandleOverlappingO добьется того, что тела будут соприкасаться, но не перекрываться, и приложит к ним импульсную силу, она вернет управление функции UpdateFrame (), а точнее, в строку 37 листинга 10.5.

Поскольку к телам приложены новые силы, функция UpdateFrame () сбрасывает в false значение переменной forceApplied. Когда выполнение доходит до строки 49, проверяется значение этой переменной. Если оно равно true (то есть силы уже прикладывались к телам, и вновь их прикладывать не нужно), функция UpdateFrame () уменьшает до 0 силы, действующие на тигров. Если силы еще не прикладывались, функция устанавливает переменную forceApplied в значение true в строке 59. При этом силы будут уменьшены до 0 при следующем вызове функции UpdateFrame ().

Завершая работу, функция UpdateFrame () еще раз перебирает всех тигров, обновляя данные о них. Теперь они будут занимать правильные положения, и их можно отображать на экране функцией RenderFrame (). Код функции RenderFrame() здесь не приведен — он вполне тривиален. Если хотите, можете просмотреть его в файле TigerToss. срр на компакт-диске.

Новости
Разработчики Theme Hospital создают новую игру Two Point Hospital
Осенью должен состояться выход нового игрового проекта Two Point Hospital, над которым работают создатели симулятора Theme Hospital.
Геймеры собирают деньги на помощь русским сиротам
Сервис Humble Store и компания Tripwire Interactive поддержат организацию Change30. Британцы предоставляют помощь русским сиротам.