ВНИМАНИЕ! СЛОЖНЫЙ ПОСТ!
Для настоящих ценителей механик!
Приветствую, с вами Taldarim1008, один из разработчиков команды ST, и сегодня я расскажу вам сложные и интересные штуки.
Вы наверняка уже смотрели сорок пятую серию "Тринадцати Огней"
Это была, бесспорно, одна из самых лучших серий, но сейчас речь пойдет о её начале -- катсцене, в которой Окетра убегала от лесных чудищ.
Данная сцена была относительно сложным испытанием для кодеров, так как нужно было передать естественные движения персонажа, и в этом посте я расскажу, как это было реализовано.
Начнем с простого - мы поставили персонажа в изначальную позицию (кстати говоря - Окетру! То есть за кадром это была именно она, а не какая то бездушная камера!) и перевели игрока в режим наблюдателя, впоследствии заставив его следить глазами персонажа.
"И это все?", -- скажете вы. "Майнкрафт и так позволяет это делать!", -- Нет! Так уж майнкрафт устроен, что вращения головы за счет анимаций не передаются камере при слежке за сущностью -- и это именно то, что нам нужно было сделать. Итак, перейдем к более сложному... Постараюсь объяснить как можно проще. Для анимации персонажей мы используем мод от Zeith, одного из наших разработчиков, который называется Hammer Animations. Он позволяет получить так называемую "Матрицу трансформаций" любой кости модели сущности. Что такое матрица? - это, можно сказать, 2д контейнер для чисел определенного размера, в нашем случае - 4 X 4 (то есть 4 ряда, 4 столбца). С помощью нее можно делать очень много крутых штук, однако это сложная математика, к которой мы притрагиваться не будем. Или же, если вы хотите, можете посмотреть видео, которое подробнее расскажет вам про эту область математики, хех.
Вернемся к матрице трансформаций - зачем она нужна? Она хранит в себе такой набор чисел, определяющий трансформации кости, который при перемножении на координату "переносит" ее туда, куда нам нужно. За счет этого мы смогли получить два вектора (направления) - куда смотрит голова по горизонтали(влево, вправо), и куда смотрит голова по вертикали (вверх, вниз). Далее, с помощью легкой тригонометрии, мы нашли угол сначала между вектором текущего направления взгляда персонажа и вектора по горизонтали, и довернули камеру до нужного угла, то же самое мы проделали и с вектором по вертикали. Однако и это еще не конец!
Майнкрафт, как многие знают, обновляет мир 20 раз в секунду, однако выводит изображение на экран (вставьте ваш FPS) раз в секунду. Это вызывает небольшие "проскоки", "лаги" при повороте головы за счет анимации, но решается это довольно просто - мы сохраняем прошлые углы поворота камеры, и при рассчете новых углов учитываем и старые, то есть проводим так называемую "линейную интерполяцию" между старыми и новыми углами. Линейная интерполяция - это функция, которая принимает на вход "процент интерполяции", и два значения, коими в нашем случае являются старый и новый углы. Объяснение процента итерполяции - это число между 0 и 1, которое определяет процент расстояния которое было пройдено от первого числа ко второму, например мы даем на вход функции три числа: 0.25, 2 и 4. Функция вычисляет расстояние между ними 4 - 2 = 2, и перемножает результат на процент - 2 * 0.25 = 0.5, впоследствии прибавляя его к началу 2 + 0.5 = 2.5 и возвращает результат (2.5). Как процент мы использовали "дельта время" - число, которое нам любезно предоставил сам майнкрафт, оно содержит в себе время, которое прошло с начала прошлого обновления(тика) игры, и позволяет делать анимации плавными. Вот такая была последовательность реализации камеры для катсцены.
Мораль сей басни такова - математика в жизни оказывается нужна.
Если было слишком сложно -- ставьте удивлённый смайлик к посту. Если было интересно -- пишите комментарии!