Технология аватаров Xbox LIVE

Автор: Topol Четверг, Май 3rd, 2012 Нет комментариев

Рубрика: Операционные системы

Представленные около двух лет назад с New Xbox Experience аватары Xbox Live быстро стали отличительной чертой истории Xbox. Вы все видели, как они болтают с аватарами ваших друзей, машут вам из панели управления, размахивают световыми мечами, удаленно управляют warthog’ми (внедорожник из вселенной Halo — прим. пер.) или даже выступают в качестве фронт-менов в вашей группе в Guitar Hero 5. А вы когда-нибудь задавались вопросом, каким образом всего этого удалось достичь? В связи с тем, что все больше и больше игр стали использовать аватары, как в качестве игровых персонажей, так и через варианты одежды и аксессуары, настало самое подходящее время для того, чтобы посмотреть изнутри на систему аватаров и на команду разработчиков, которые создали ее для Xbox. В этой статье Дэн Кройманн (Dan Kroymann), старший разработчик Xbox и один из первых членов команды разработчиков аватаров, расскажет об основах технологии Xbox LIVE  Avatars.

Взгляд на систему аватаров сверху
В начале, когда мы впервые взялись за проектирование системы аватаров, при формировании основных решений по проекту нам помогали несколько ключевых технических целей. Прежде всего, система аватаров должна быть достаточно простой для того, чтобы разработчики могли приспособить ее к их играм, но в то же она должна быть достаточно мощной и гибкой, чтобы не ограничивать их творческие возможности. Следующая цель состояла в том, чтобы проектировать систему с учетом обратной/прямой совместимости с самого начала. Нам было необходимо создать систему, которая позволила бы нам добавлять новые функции в течение долгого времени и позволить использовать максимальное количество этих функций с играми, которые уже вышли. Классический пример такой прямой совместимости можно увидеть в Avatar Marketplace, который был выпущен год спустя после релиза Xbox LIVE Avatars. Не требуя внесения никаких изменений, существующие игры, работающие с аватарами, смогли автоматически обрабатывать аватаров, одетых в новую загружаемую одежду, и это при том, что при создании этих игр вообще не было такого понятия, как загружаемая одежда.

С учетом этих основных принципов проектирования система аватаров может быть разбита на следующие высокоуровневые компоненты:

  • Метаданные аватара: очень компактное описание вашего аватара, включая всю информацию о вашей одежде, росте, весе, цвете волос, цвете кожи, чертах лица и т.д. Этот крошечный объект весит менее 1 Кб, и именно его Xbox использует для описания вашего аватара. Когда игра хочет отобразить аватара пользователя, она запрашивает у Xbox LIVE метаданные аватара пользователя, после чего передает объект метаданных в систему аватаров для загрузки полного аватара.
  • Система загрузки ресурсов. Используя метаданные аватара, эта система обрабатывает расположение и загружает все компоненты, из которых состоит аватар, возвращая полный набор художественных средств (т.е. скелет, 3D модели, текстуры, анимации и т.д.), которые необходимы игре для визуализации аватара. В качестве основной части обратной совместимости, этот код выполняется на системном программном обеспечении Xbox, что означает, что у нас есть возможность обновлять его без необходимости вносить исправления в игры, которые уже выпущены. Такой дизайн системы позволил нам добавить Avatar Marketplace и призовой контент через системное обновление в прошлом году.
  • Анимация и рендеринг: Чтобы позволить разработчикам быстро встраивать аватары в их игры и сохранить согласованность художественного оформления для различных игр, заключительный компонент, предоставленный командой Xbox, является стандартной системой анимации и рендеринга. Визуализатор спроектирован как простой «встраиваемый» компонент, который может быть включен в архитектуру существующей игры и конвейер визуализации с минимальными усилиями. Это позволяет разработчикам быстро выстраивать аватары в их игру, не тратя на это недели — с помощью нескольких строчек кода разработчик может загружать аватара и получать его визуальное изображение на экране. Аватар автоматически дышит и двигается, так как это реализовано в циклически запускаемых встроенных анимациях, а с помощью дополнительных пары строчек разработчик может вызвать последовательность анимаций, таких как махание, хлопанье или другие движения.

Из чего состоит Аватар?

Скелет
Все это начинается со скелета. У каждого аватара есть скелет, как и у любого предмета, например, светового меча или 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: при игре по сети против других пользователей, их аватары могут использовать ресурсы, которые недоступны на вашем Xbox. В этом случае необходимые ресурсы скачиваются «на лету» с Xbox LIVE. В целях оптимизации эти ресурсы временно кэшируются, чтобы в случае, если два аватара используют один и тот же элемент одежды, он был загружен только один раз.
  • Локально установленная копия: при загрузке ресурса для аватара удаленного игрока, если кто-то на вашем Xbox уже приобрел или получил в подарок данный ресурс, то будет использоваться локально установленная копия, что увеличивает скорость работы, избегая ненужной загрузки с Xbox LIVE.
  • Ваш профиль пользователя: всякий раз, когда вы покупаете/выигрываете ресурс для вашего аватара, копия этого элемента записывается в ваш профиль. Это позволяет вам брать с собой ваш профиль на карте памяти, когда вы собираетесь в гости к вашему другу, и, не требуя подключения к Xbox LIVE, ваш аватар может быть загружен даже в том случае, если на консоли вашего друга в данный момент нет всех нужных элементов одежды вашего аватара.

Как я уже упоминал в начале этой статьи, логика загрузки ресурсов является основой прямой/обратной совместимости системы Xbox LIVE Avatar. Проектируя систему загрузки ресурсов с соблюдением данного принципа, мы смогли добавить новую функцию скачиваемых ресурсов через год после того, как аватары были впервые представлены, и при этом не потребовалось вносить какие-либо изменения в уже существующие игры. Код игры не знает, и, фактически, не должен знать, откуда берутся ресурсы и каким образом они загружаются и распаковываются. Игра просто говорит системе: «Не могли бы вы мне дать текстуры, модели и т.д., которые необходимы мне для рендеринга этого аватара?», а мы уже заботимся обо все остальном.

Когда что-то идет не так …
Так как я любил технические вызовы, которые вставали передо мной во время проектирования системы Xbox LIVE Avatar, неожиданные ошибки, с которыми я сталкивался, делали мою работу немного более веселой, чем обычная работа разработчика обычного программного обеспечения. Я не перестаю повторять моим друзьям и коллегам из команды Xbox: «Мои ошибки круче ваших ошибок». Потому позвольте представить вам небольшую подборку наиболее забавных багов, с которыми я сталкивался при работе над системой Xbox LIVE Avatar:

Источник: thevista.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты