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

Сначала UpdateFrame () устанавливает переменную состояния forceApplied в значение false. Это значит, что силы, действующие на твердые тела в сцене, еще не прикладывались в текущем кадре. Твердые тела еще не анимировались с учетом этих сил.

В строке 6 задается временной шаг, равный 1. Вспомните, в функции Gamelnitialization () масса тигров задана равной 100 кг. Единицы измерения силы - кг • м / с2. Поэтому временной шаг равен 1 секунде.

Замечание

Временной шаг выбран таким, чтобы программа нормально выполнялась на машинах, видеокарты которых не поддерживают в полном объеме возможности DirectX 9. Этот пример использует аппаратные вертексные процессоры, если они есть. Если нет, используется программная обработка вертексов. Если ваша видеокарта не высшего класса и старше 2-3 лет, она, возможно, не содержит аппаратных вертексных процессоров. Для таких машин нужно задавать временной шаг порядка секунды, чтобы движение на экране было достаточно плавным. Если вы обнаружите, что программа работает слишком быстро и дает дерганую, неравномерную анимацию, попробуйте изменить временной шаг на milliseconds_per_frame/1000. Это сделает временной шаг зависящим от частоты смены кадров - 30 кадров в секунду. Анимация будет плавной и качественной для тех, у кого видеокарты поддерживают аппаратную обработку вертексов.

Затем UpdateFrame () получает значение текущего времени и вызывает функцию TimeToUpdateFrame (). Код функции TimeToUpdateFrame () приведен в строках 75-94 листинга 10.5. Эта функция проверяет, прошло ли 33 миллисекунды после предыдущего обновления кадра. Если да, функция возвращает true, в противном случае она возвращает false. Эта функция ограничивает частоту смены кадров величиной 30 кадров в секунду. Если со времени последнего обновления кадра прошло меньше 33 миллисекунд, то функция UpdateFrame () просто возвращает управление (строки 9-10).

Если пора обновлять кадр, функция UpdateFrame () перебирает список тигров с помощью пары вложенных циклов. Каждый тигр проверяется на предмет наличия столкновений с остальными тиграми из списка. В строках 19-23 создается переменная типа collision и выполняется проверка наличия столкновения между тиграми. Результаты проверки обрабатываются в операторе switch, начинающемся со строки 24. Если ограничивающие сферы соприкасаются, функция UpdateFrame () вызывает метод collision : : CalculateReactions (), прикладывающий к столкнувшимся тиграм силы, возникающие при столкновении. Если столкновения нет, функция UpdateFrame () не делает ничего.

Замечание

Думаю, понятно, что ветвь оператора switch, соответствующая значению C0LLISI0N_N0NE, не обязательна. Она присутствует в программе только в иллюстративных целях.

Новости
«Мясной» экшен Redeemer: Enhanced Edition задержится до осени
Издательство «Бука» и студия Sobaka объявили о том, что кровавый экшен Redeemer: Enhanced Edition, ранее запланированный к выходу в августе, был отложен на осень.
Steam-версия Orwell бесплатна до завтра
Игру можно забрать в течение суток, получив ключ для активации в Steam.