DataLife Engine > Новости > Технология аватаров Xbox LIVE
Технология аватаров Xbox LIVE14 мая 2010. Разместил: deeper2k |
Представленные около двух лет назад с New Xbox Experience аватары Xbox Live быстро стали отличительной чертой истории Xbox. Вы все видели, как они болтают с аватарами ваших друзей, машут вам из панели управления, размахивают световыми мечами, удаленно управляют warthog’ми (внедорожник из вселенной Halo - прим. пер.) или даже выступают в качестве фронт-менов в вашей группе в Guitar Hero 5. А вы когда-нибудь задавались вопросом, каким образом всего этого удалось достичь? В связи с тем, что все больше и больше игр стали использовать аватары, как в качестве игровых персонажей, так и через варианты одежды и аксессуары, настало самое подходящее время для того, чтобы посмотреть изнутри на систему аватаров и на команду разработчиков, которые создали ее для Xbox. В этой статье Дэн Кройманн (Dan Kroymann), старший разработчик Xbox и один из первых членов команды разработчиков аватаров, расскажет об основах технологии Xbox LIVE Avatars.
Взгляд на систему аватаров сверху В начале, когда мы впервые взялись за проектирование системы аватаров, при формировании основных решений по проекту нам помогали несколько ключевых технических целей. Прежде всего, система аватаров должна быть достаточно простой для того, чтобы разработчики могли приспособить ее к их играм, но в то же она должна быть достаточно мощной и гибкой, чтобы не ограничивать их творческие возможности. Следующая цель состояла в том, чтобы проектировать систему с учетом обратной/прямой совместимости с самого начала. Нам было необходимо создать систему, которая позволила бы нам добавлять новые функции в течение долгого времени и позволить использовать максимальное количество этих функций с играми, которые уже вышли. Классический пример такой прямой совместимости можно увидеть в Avatar Marketplace, который был выпущен год спустя после релиза Xbox LIVE Avatars. Не требуя внесения никаких изменений, существующие игры, работающие с аватарами, смогли автоматически обрабатывать аватаров, одетых в новую загружаемую одежду, и это при том, что при создании этих игр вообще не было такого понятия, как загружаемая одежда. С учетом этих основных принципов проектирования система аватаров может быть разбита на следующие высокоуровневые компоненты:
Из чего состоит Аватар? Скелет Все это начинается со скелета. У каждого аватара есть скелет, как и у любого предмета, например, светового меча или RC Warthog. В системе аватаров когда мы говорим о скелете, на самом деле мы обращаемся к набору суставов, которые связаны друг с другом в иерархической структуре. Другими словами, сустав бедра соединен с коленным суставом, который соединен с суставом лодыжки, и если вы повернете сустав бедра, коленный сустав и сустав лодыжки повернутся соответствующим образом. Аватар Xbox LIVE состоит из 71 сустава, половина из которых расположены только на руках! Требуется много суставов, чтобы создать выразительные руки и пальцы, способные сжимать кулак, показывать жест с большим пальцем, поднятым вверх, или вращать барабанные палочки. В каждом кадре при проигрывании анимации суставы скелета поворачиваются и перемещаются в точности в ту позу, которая требуется для этого кадра. Чуть позже я подробнее расскажу о том, как работает система анимации, но сейчас давайте просто посмотрим на то, что происходит, когда скелет был настроен для одного кадра и вы готовы визуализировать аватара в этой позе. Применение оболочки к Аватару Нет, я говорю не о нарезке филе из вашего бедного аватара в лучших традициях Молчания ягнят (слово "skinning" можно также перевести, как свежевание - прим. пер.). В компьютерной графике применением оболочки (или скиннингом) называют процесс применения сложной 3D-модели к основному скелету. Все 3D-модели, из которых состоит аватар (тело, голова, волосы, одежда, аксессуары и т.д.) создаются в статической позе, когда аватар стоит прямо его руки подняты с стороны (в виде буквы "Т"). Каждая из вершин в модели может быть связана с четырьмя суставами в скелете. Это означает, что при повороте или движении суставов скелета, вершины моделей движутся вместе с ними. По умолчанию визуализатор аватара использует для всей этой работы GPU, что означает, что данных моделей никогда не должен касаться или изменять центральный процессор CPU. В каждом кадре модели передаются в GPU в статической позе "Т" (также известная как "поза привязки", названная так потому, что это поза, в которой вершины модели привязываются к скелету). После этого GPU заботится о преобразовании каждой вершины в отдельности из ее позиции по умолчанию в позицию, соответствующую текущему расположению скелета. Лицевая анимация Следующим шагом после налаживания геометрии управления моделями в корректной позе для текущего кадра анимации, является анимация выражений лица. В отличие от рук и ног аватара, которые являются трехмерными формами, которые могут быть анимированы перемещением скелета, глаза, брови и рот аватара являются простыми текстурами, которые нарисованы на голове аватара. Вы можете думать о голове как о чистом холсте, на который мы вставляем отдельные рисунки, представляющие ту или иную часть лица. Для анимации этих элементов, мы выбираем, какую текстуру нужно использовать для конкретной черты лица из коллекции различных текстур (например, улыбающийся рот, нахмурившийся рот, злой рот, открытый рот и т.д.). Поэтому каждый кадр анимации состоит из определенной позы скелета, наряду со ссылками на желаемые текстуры для каждой анимированной черты лица. Освещение Аватары Xbox LIVE выглядят очень хорошо, и они достаточно детализированы, чтобы их можно было использовать для замены обычных игровых персонажей. Освещение, применяемое к аватару, является очень важным компонентом для достижения этой цели. По умолчанию при визуализации несколько различных источников света и эффектов объединяются для создания теплого, мягкого представления аватара, с одной стороны избегая скучного пластмассового вида традиционной компьютерной графики, а с другой стороны не углубляясь в гипер-реализм, которого пытаются добиться многие современные игры. Ниже представлены три первичных компонента освещения по отдельности и совместно. Мы начинаем с базового окружающего света, который освещает аватара плоским, не отбрасывающим тени светом. Сам по себе этот свет ничего не дает для освещения деталей аватара. В этом случае не различимы друг от друга такие элементы, как пальцы или подбородок и шея. Следующий шаг заключается в применении эффекта "контурного света" (rim light), который дает ощущение нахождения источника света, расположенного позади аватара и создает более "теплую" картинку. Этот эффект достигается путем применения света с экспоненциально возрастающей яркостью на поверхности аватара, направление которого перпендикулярно плоскости, в которой был визуализирован аватар. Как и большинство эффектов в компьютерной графике, это упрощенное представление процесса из реального мира, которое намного проще вычислять в режиме реального времени, чего его на 100% соответствующий законам физики аналог. Внимательные наблюдатели заметят некоторые недостатки в освещении поверхности контурным светом, которая перпендикулярна точке наблюдения, но не расположена на внешней границе аватара (например, нос). Это компромисс, на который нам пришлось пойти для получения нужной нам визуализации, затрачивая при этом минимум ресурсов, необходимых для рендеринга в реальном времени. Заключительный главный компонент системы освещения - направленный источник света, который обычно расположен выше и правее аватара. Этот последний штрих освещает аватара и добавляет его изображению немного глубины, позволяя аватару отбрасывать тень на самого себя, что приводит нас к следующей теме: Самозатенение. Самозатенение Чтобы придать аватару цельный вид, сделать его более правдоподобным, первичный направленный источник света используется для "самозатенения". Как ясно из названия, самозатенение используется для объекта, отбрасывающего тень на самого себя (в противоположность объекту, отбрасывающему тень на окружающую его среду). Стандартный рендерер достигает эффекта самозатенения посредством использования карты теней, сгенерированной в реальном времени. Для каждого кадра как только аватар был установлен в желаемую позу, происходит просчет аватара с применением направленного света. Во время этого прохода рендеринга вместо регистрации цвета для каждого визуализируемого пикселя мы записываем расстояние от источника света до этого пикселя, также известное как "глубина" данного пикселя. В результате мы получаем картинку в градациях серого, которую мы называем "картой теней", определяющей для каждого пикселя на изображении расстояние, которое должен пройти луч света до того, как он достигнет какой-то поверхности. Мы можем использовать это изображение при рендеринге аватара для определения того, должна ли определенная область на аватаре быть освещена направленным светом, или она должна быть затенена. Чтобы объяснить, как это работает, давайте вернемся назад к тому шагу, где мы сгенерировали карту теней. Возьмем один из лучей света, который пересекает некую точку на поверхности аватара и представим, как он распространяется по аватару. Все, с чем он столкнется при своем движении вперед будет затенено первой точкой поверхности, на которую упал этот луч. Кроме того, мы знаем, что расстояние от источника света до любой дополнительной точки пересечения его с поверхностью будет больше, чем расстояние до первой точки поверхности. Иначе говоря, для любого конкретного луча света есть несколько точек на поверхности аватара, которые пересекает этот луч, и из этих точек только одна точка, расположенная ближе всего к источнику света, должна быть освещена. Теперь вернемся обратно к главному проходу рендеринга. Для каждого нарисованного при рендеринге аватара пикселя, мы вычисляем путь луча, который он проделал от источника до данного пикселя. Этот луч соответствует определенной точке на карте теней, так что для определения того, должен ли этот пиксель быть освещен, все, чтобы мы должны сделать, это сравнить расстояние между ним и источником света и расстояние, записанное для этого луча в карте теней. Если расстояние до пикселя больше значения в карте теней, то становится очевидным наличие какого-то объекта на том же самом луче, который находится ближе к источнику света, что приводит к накладыванию тени на этот пиксель. Как создаются ресурсы и как игра их загружает? Пакеты артов и риг аватара До сих пор я рассказывал о том, как игра анимирует и визуализирует аватара, но я упускал одну важную часть этого процесса: откуда берутся различные ресурсы (модели, текстуры и т.д.) которые нужны игре для рендеринга аватара? Все это начинается с художника, работающего либо в Maya, либо в 3D Studio Max. Используя риг (от англ. Rig) персонажа, созданного Rare, художники начинают работу над 3D-моделями, представляющими собой какую-то определенную часть одежды, и создают текстуры, которые будут накладываться на эту модель. Затем эти модели надеваются на соответствующие суставы в скелет аватара. Каждая точка модели тщательно связывается с 4 (максимум) суставами, чтобы при движении и повороте этих суставов модель правдоподобно крутилась и искажалась. У каждого типа одежды есть определенная область, в пределах которой она должна оставаться, чтобы гарантировать отсутствие невозможных пересечений между двумя элементами одежды, или между одеждой и внешнего игрового пространства. Например, если бы шляпа аватара была бы слишком высокой, что могло бы создать проблемы для игр, в которых их игровое пространство построено с учетом более типичных размеров аватара. Чтобы предотвратить появление в играх такого рода проблем, существует специальная фигура для ресурсов, известная под названием "maximum bounding mesh" (или как я зову его - зефирный человек), которая используется для указания границ, в которых необходимо оставаться художникам, а также позволяет разработчикам игр планировать окружение своих игр для максимально возможной фигуры аватара. У каждого типа одежды есть свой определенный объем памяти, который может использоваться для данных 3D-геометрии и текстур - это позволяет коду, выполняемому на Xbox, определять объем памяти, необходимый ему для загрузки аватара, и при этом вовсе не обязательно знать набор всех возможных вариантов одежды. Все эти ограничения реализованы в инструментах, которые компилируют наборы художественных ресурсов и подготавливают их для использования на Xbox. Сжатие ресурсов На Xbox, как и на любой другой игровой консоли, такие ресурсы, как дисковое пространство, память и пропускная способность сети, всегда в дефиците, что вынуждает игровые движки тщательным образом контролировать свое потребление ресурсов. Для того, чтобы минимизировать пропускную способность сети, необходимую для загрузки ресурсов аватара, и объем дискового пространства, необходимого для его хранения, система Xbox LIVE Avatar использует коллекцию сложных алгоритмов сжатия, для максимального уменьшения размеров ресурсов. Данные текстур хранятся в сжатом формате, известном как DXT. Одним из преимуществ данного формата сжатия текстур является то, что GPU Xbox может непосредственно считывать его, без необходимости проводить декомпрессию, т.е. мало того, что размер сжатого файла меньше, но к тому же и меньше используется память, так как текстуру не нужно в ней распаковывать. 3D-геометрия сжимается с помощью алгоритма сферической квантизации, который может быть настроен для нахождения правильного баланса между размеров сжатия и ухудшением качества оригинальной модели. Вот как это работает: мы начинаем с того, что берем набор сфер и упаковываем их вместе в гексагональную решетку. Затем мы накладываем оригинальную 3D-модель на то же самое пространство. Каждая вершина в модели переносится со своей изначальной позиции в пространстве на центр ближайшей сферы. При этом мы можем записать позицию этой вершины в виде простого числа, которое указывает, с какой сферой она связана, вместо того, чтобы записывать точные координаты X/Y/Z ее позиции в пространстве. Делая сферы больше, мы можем сократить размеры файла за счет того, что вершины могут быть перенесены еще дальше от их изначальных позиций. И наоборот, делая сферы все меньше и меньше, вершины остаются ближе к их оригинальным позициям, но при этом становится больше записей, обозначающих, к какой сфере привязана на или иная вершина, и, следовательно, увеличивается размер файла. После выполнения этих двух шагов сжатия (DXT-сжатие текстур и сферическая квантизация 3D-геометрии), мы выполняем дополнительное общее сжатие LZX над всем файлом, что еще больше уменьшает размер файла, не теряя при этом качества. Декомпрессия анимации по запросу Данные анимации используют подобную схему для сжатия геометрии, при этом используется дополнительная функция, которая поддерживает показатель использования памяти во время выполнения на минимальном уровне. Во время сжатия анимация нарезается на серии ключевых кадров, равномерно распределенных по времени проигрывания анимации. Каждый ключевой кадр содержит позицию/поворот каждого сустава в скелете, а также индексы различных уровней лицевых текстур. Данные суставов сжимаются с помощью того же самого алгоритма сжатия сферической квантизации, используемого для 3D-геометрии, однако, в отличие от вершин модели, при загрузке аватара (или, в данном случае, загрузки анимации) их декомпрессия не производится. Во время выполнения для вычисления точной позы скелета в любой момент, система анимации производит декомпрессию ключевых кадров, которые расположены непосредственно до и после этого момента времени, а затем производят сглаживание между позами, описанными в этих двух ключевых кадрах. Позиции суставов линейно интерполированы, то повороты суставов смешаны с использованием сферической линейной интерполяции. Использование этого метода ключевых кадров делает возможным плавное и точное воспроизведение анимации вне зависимости от частоты смены кадров в игре или от скорости проигрывания анимации. Позволяя проводить декомпрессию ключевых кадров по запросу, мы минимизируем использование памяти системой анимации, однако это достигается за счет дополнительной обработки кадров на CPU. Загрузчик ресурсов Когда игра хочет отобразить аватар пользователя, она запрашивает у Xbox LIVE метаданные аватара пользователя (очень компактная структура, содержащая полное описание аватара) и затем передает этот объект метаданных в систему загрузки ресурсов. Затем система загрузки ресурсов разбирает метаданные, определяет расположение и загружает все ресурсы, необходимые для аватара, и, наконец, производит декомпрессию ресурсов в необработанные текстуры, вершинные буферы и т.д. для их использования игрой. Когда аватары Xbox LIVE были впервые представлены в виде элемента New Xbox Experience, все ресурсы, доступные для использования на аватаре, хранились на Xbox в файле, известном по названием "Avatar Asset Pack". Каждый Xbox имел одинаковый пакет доступных ресурсов, независимо от того, находился он в сети или нет, что сделало процесс загрузки ресурсов очень простым. Следующим летом мы представили Avatar Marketplace и Avatar Awards, что означало, что теперь ресурсы будут поступать также из источников, отличных от Avatar Asset Pack. Оригинальный набор ресурсов по-прежнему загружался из Avatar Asset Pack, тогда как новые ресурсы загружались из трех возможных расположений:
Когда что-то идет не так ... Так как я любил технические вызовы, которые вставали передо мной во время проектирования системы Xbox LIVE Avatar, неожиданные ошибки, с которыми я сталкивался, делали мою работу немного более веселой, чем обычная работа разработчика обычного программного обеспечения. Я не перестаю повторять моим друзьям и коллегам из команды Xbox: "Мои ошибки круче ваших ошибок". Потому позвольте представить вам небольшую подборку наиболее забавных багов, с которыми я сталкивался при работе над системой Xbox LIVE Avatar:
Вернуться назад |