Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DirectX. Продвинутая Анимация (2004) [rus].pdf
Скачиваний:
335
Добавлен:
16.08.2013
Размер:
8.39 Mб
Скачать

244 Глава 8

Морфинг в действии

Возвратимся в ранние 90-е. Революционная технология компьютерной графики, известная как морфинг, появилась на большой арене благодаря Майклу Джексону. Нет, я не говорю о его неудачной пластической операции, я говорю об использовании морфинга в одном из его видео-клипов. Да, Король Попа использовал технологии морфинга в видео-клипе на свою песню "Black or White" и создал феномен анимации, который существует и по сей день.

В случае если вы не видели этот клип, позвольте мне объяснить. Он включает отрывок, в котором человек танцует под мелодию, а камера направлена на его лицо. Каждые несколько секунд его лицо превращается в лицо какого-нибудь другого человека. И так продолжается, пока лица не превратятся более чем 10 раз. Результат использования морфинга в этом клипе просто потрясающ, и я до сих пор помню его отчетливо!

По мере того как проходили годы, морфинг наконец то добрался до игр. В то время как в старые времена под морфингом понимали цифровую обработку видео, включающую плавное изменение одной картинки на другую (как, например, в "Black or White"), современный же морфинг (или, по крайне мере, обсуждаемый нами) включает в себя плавное изменение трехмерного меша с течением времени.

Наверное, самым известным примером игры, использующей морфинг является id'шный Quake. В Quake все анимационные последовательности движения персонажей созданы из наборов морфируемых мешей. Один меш постепенно принимает форму второго меша, второй меш принимает форму третьего и т. д.

При использовании небольшого интервала времени и достаточного количества морфируемых мешей все последовательности анимаций будут плавными и очень легко обрабатываемыми. Quake может выполняться с приличной скоростью даже на самых медленных компьютерных системах. Причиной этого является простота работы с морфирующими анимациями, что вы и увидите в следующих главах.

Как вы уже могли предположить морфинг, иногда называемый твиннинг (tweening), как, например, в DirectX SDK) - это процесс изменения одной формы

вдругую с течением времени. Для нас этими формами являются меши. Процесс морфинга меша включает в себя постепенное изменение координат вершин меша, начиная с одной формы и переходя к другой.

Меш, содержащий ориентацию вершин в начале процесса морфинга, называется исходным мешем. Второй меш, ориентацию вершин которого принимает исходный

врезультате процесса морфинга, называется целевым мешем. Давайте рассмотрим эти меши более подробно, чтобы лучше понимать сам процесс морфинга.

Работа сморфирующейанимацией

245

Определение исходного и целевого меша

Исходный и целевой меши, с которыми вы будете работать в этой книге, являются обычными объектами ID3DXMesh. Однако вы не можете просто использовать два меша для морфинга; существуют определенные правила. Во-первых, каждый меш должен иметь одинаковое количество вершин. В процессе морфинга вершины исходного меша просто перемещаются в положение вершин целевого меша. Отсюда следует второе правило: каждой вершине исходного меша должна соответствовать вершина (точнее индекс вершины) в целевом меше. В качестве примера посмотрите на меши, изображенные на рис. 8.1.

Начало

Промежуточное

Окончание

морфирования

время

морфирования

Рис. 8.1. Во время процесса морфинга вершины исходного меша плавно перемещаются в положение вершин целевого меша. Каждая вершина имеет одинаковый индекс как в исходном, так и в целевом меше

Порядок вершин является важным. Вершина, движущаяся из исходного меша, должна двигаться к вершине, имеющей тот же самый индекс в целевом меше. Если вы перенумеруете порядок, вершины будут двигаться в неправильных направлениях при морфинге, производя забавно выглядящие результаты, как показано на рис. 8.2.

Если вы создаете меши, содержащие одинаковое количество вершин и имеющие одинаковый их порядок, то все в нормально. Что касается получения фактических данных меша, я оставляю это вам. Вы можете использовать функцию D3DXLoadMeshFromX или любую функцию, которую вы разработали в главе 1, для загрузки мешей. После того как вы загрузили два меша и подготовили их к использованию, можно их морфировать!

246

 

Глава8

Исходный меш

Промежуточный меш

Целевой меш

 

 

1

Время

Начало

Промежуточное

Окончание

морфирования

время

морфирования

Рис. 8.2. Морфинг прошел неудачно, порядок вершин в исходном и целевом мешах различен, из-за чего получается странный результат

Морфинг мешей

Теперь, когда вы имеете два меша, с которыми будете работать (исходный и целевой), вы можете начинать процесс морфирования. Помните, что морфирование - это процесс изменения одной формы на другую. Необходимо чтобы вершины исходного меша, находящиеся в начальном положении, постепенно двигались к положению вершин целевого меша.

Вы можете измерять интервал времени, используемый для отслеживания движения вершин из координат исходного меша в координаты целевого, при помощи скаляра (находящегося в диапазоне от 0 до 1). При значении скаляра, равного 0, вершины будут расположены в исходном меше, в то время как при значении скаляра 1 вершины будут располагаться в целевом меше. На рис. 8.3 показано, что любое значение скаляра от 0 до 1 расположит вершины между положением исходного и целевого меша.

Вычислять координаты расположения вершины между исходным и целевым мешами очень просто. Возьмите вершину исходного меша и умножьте ее координаты на обратное значение скаляра (1.0-scalar). Использование обратного значения скаляра означает, что координаты вершины будут определяться на 100 процентов координатами ее в исходном меше при значении скаляра, установленного в 0, и на 0 процентов при скаляре, установленном в 1.

Работа сморфирующейанимацией

247

Рис. 8.3. Начиная с координат в исходном меше (и значении скаляра 0), вершина постепенно движется к положению в целевом меше по мере увеличения скаляра

Далее, используя вершину, имеющую тот же самый индекс целевого меша, что и ранее, умножьте ее координаты на значение скаляра. Сложив два получившихся значения, вы получите результирующие координаты вершины в сморфированной анимации.

Сначала концепция умножения координат вершины на скаляр и последующее сложение результатов может показаться странным. Если вы не уверены в математике, проделайте следующие вычисления, чтобы убедиться в правильности полученного результата. Используйте одномерное значение для представления координат вектора. Установите координату исходной точки в 10, а координату целевой точки в 20. Для упрощения, используйте значение скаляра равное 0.5, которое должно дать 15, в качестве результирующей координаты вершины при морфинге.

Умножив исходную координату (10) на 1-0.5 получим 5. Умножив целевую координату (20) на 0.5 получим 10. Сложив два результата (5 и 10) получим 15. Разве не замечательно - получить правильный результат!

Эту процедуру можно записать в виде следующего кода, полагая что координаты исходной вершины хранятся в vecSource, координаты целевой вершины хранятся в vecTarget, а'значение скаляра в Scalar.

//vecSource = D3DXVECTOR3 содержащий исходные координаты

//vecTarget = D3DXVECTOR3 содержащий целевые координаты

//Scalar = FLOAT содержащее значение скаляра

//Умножить исходные координаты на исходный скаляр D3DXVECTOR3 vecSourcePos = vecSource * (1.0f-Scalar);

//Умножить целевые координаты на скаляр

D3DXVECTOR3 vecTargetPos = vecTarget * Scalar;

// Сложить два получившихся вектора

D3DXVECTOR vecPos = vecSourcePos + vecTargetPos;

Соседние файлы в предмете Программирование на C++