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

394

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

Самым простым способом добавить дополнительные пружины в меши является составления их списка, из которого вы потом можете их создать. Вы можете получить этот список, используя специализированный анализатор .X файла. И пока вы этим заняты, почему бы заодно не использовать специализированный анализатор .X файлов для получения данных масс точек!

Загрузка данных масс и пружин из .X файла

Не беря во внимание данные меша, которые вы можете загрузить из .X файла, что еще полезного может в нем содержаться? Ну, для начала, данные меша не содержат информации о массе точек одежды. А как насчет тех пружин, которые возможно вы захотите добавить в одежду для обеспечения дополнительной жесткости?

Хорошо, поводов для беспокойства нет - .X замечательно подходит для хранения дополнительных данных одежды, таких как значения масс точек и используемые пружины. Добавив два небольших шаблона в файл .X и набор классов в исходные файлы, получение дополнительных данных о массах точек и пружинах становится очень простым.

Два шаблона определяются следующим образом (с определением макроса GUID, используемым в исходном коде):

//DEFINE_GUID(ClothMasses,

//0xf5ad0f93, 0x9bf2, 0x4bcf,

//0xb7, 0xcf, 0xd6, 0x8c, 0xd6, 0xb5, 0x41, 0x56);

template ClothMasses { <F5AD0F93-9BF2-4bcf-B7CF-D68CD6B54156> DWORD NumPoints; // # значений масс точек

array FLOAT Mass[NumPoints]; // значения масс

}

//DEFINE_GUID(ClothSprings,

//0x8c08b088, 0x728e, 0x46c8,

//0xbe, 0x87, 0x72, 0x67, 0x2b, 0x81, 0xdb, 0x11); template ClothSprings {

<8C08B088-728E-46c8-BE87-72672B81DB11> DWORD NumSprings; // # загружаемых пружин DWORD NumVertices; // NumSprings * 2

array DWORD Vertex[NumVertices]; // используемые точки пружин

}

Имитирование одежды и анимация мешей мягких тел

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

Вот пример объекта данных, который использует шаблон ClothMasses для хранения шести значений масс точек:

ClothMasses { 6;

1.0, 0.0, 0.0, 1.0, 1.0, 1.0;

}

Список значений масс соответствует точкам меша одежды - первое значение массы используется для первой точки одежды, второе для второй и т. д. В моем примере, первое, четвертое, пятое и шестое значения масс установлены в 1, в то время как второе и третье установлены в 0.

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

Предположим, что вы хотите определить три пружины, соединяющие шесть вершин. Вот пример объекта данных, который соединяет 0 и 1, 1 и 2, 2и0 точки.

ClothSprings { 3; 6; 0,1, 1,2,

2,0;

}

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

396

Глава 13

Создание анализатора .X данных одежды

В который раз, класс анализатора .X cXParser из главы 3 приходит нам на помощь. Здесь вы унаследуете класс от класса cXParser, который будет искать два различных шаблона - один, содержащий значения массы одежды (ClothMasses), и другой, который будет хранить информацию о пружинах (ClothSprings).

Для хранения данных обоих объектов замечательно подходят классы точки и пружины, определенные ранее в этой главе, - все, что необходимо, это класс анализатора для перечисления объектов и получения их данных. Вот пример класса анализатора .X, который сделает все для вас:

class cClothMesh : cXParser

{

protected:

DWORD m_NumPoints; // # точек в одежде cClothPoint *m_ClothPoints; // данные точек DWORD m_NumSprings; // # пружин в одежде cClothSpring *m_ClothSprings; // данные пружин

protected:

// Анализирует файлы .X и получает данные масс и пружин BOOL ParseObject(IDirectXFileData *pDataObj,

IDirectXFileData *pParentDataObj, DWORD Depth,

void **Data, BOOL Reference)

{

const GUID *Type = GetObjectGUID(pDataObj);

DWORD *DataPtr = (DWORD*)GetObjectData(pDataObj, NULL);

// Считать массы точек одежды if(*Type == ClothMasses) {

//Получить количество присваиваний масс DWORD NumPoints = *DataPtr++;

//Скопировать значения масс

float MassPtr = (float*)DataPtr; for(DWORD i=0;iXNumPoints;i++) { m_ClothPoints[i].m_Mass = *MassPtr++;

// Вычислить 1/масса m_ClothPoints[i].m_OneOverMass = \

(m_ClothPoints[i].m_Mass==0.0f) ? \ 0.0f:(1.0f/m_ClothPoints[i].m_Mass);

}

}

// Считать данные пружин if(*Type == ClothSprings) {

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