Загрузка скелетных мешей из .X

Загрузка скелетных мешей из .X файлов очень похожа на загрузку обычных мешей. Используя специализированный анализатор .X файлов, вы должны перечислить объекты, содержащиеся в .X файле, при помощи функции ParseObject. Когда придет время обрабатывать объект Mesh, вместо вызова функции D3DXLoadMeshFromXof для загрузки данных меша используйте D3DXLoadSkinMeshFromXof, которая имеет дополнительный параметр - указатель на объект ID3DXSkinInfo. Посмотрите на прототип функции D3DXLoadSkinMeshFromXof, чтобы понять о чем я.

HRESULT D3DXLoadSkinMeshFromXof(

IDirectXFileData *pXofObjMesh, // Объект .X файла DWORD Options, // Опции загрузки

IDirect3DDevice9 *pDevice, // Используемое 3D устройство ID3DXBuffer **ppAdjacency, // объект буфера смежности ID3DXBuffer **ppMaterials, // объект буфера материала ID3DXBuffer **ppEffectInstances, // объекты экземпляров эффектов DWORD *pMatOut, // # материалов

ID3DXSkinInfo **ppSkinInfo, // объект информации скелета!!! ID3DXMesh **ppMesh); // загруженный объект меш

Когда вы готовы загрузить меш из перечисленного шаблона Mesh, вызовите функцию D3DXLoadSkinMeshFromXof вместо D3DXLoadMeshFromXof. Убедитесь, что вы указали объект ID3DXSkinInfo, заданный в прототипе. Неважно, содержит ли шаблон Mesh скелетный меш, функция D3DXLoadSkinMeshFromXof загружает как обычные, так и скелетные меши. Вот пример:

// Определить структуры меша и информации скелетного меша ID3DXMesh *pMesh; ID3DXSkinInfo *pSkinInfo;

// Определить буферы для хранения данных материалов и смежностей ID3DXBuffer *pMaterialBuffer = NULL, *pAdjacencyBuffer = NULL;

// DWORD для хранения количества загруженных материалов DWORD NumMaterials;

// Загрузить скелетный меш из IDirectXFileDataObject pDataObj D3DXLoadSkinMeshFromXof(pDataObj, D3DXMESH_SYSTEMMEM, \

pDevice, &pAdjacencyBuffer, \

&pMaterialBuffer, NULL, \

&NurrMaterials, &pSkinInfo, &pMesh) ;

Использование функции D3DXLoadSkinnedMeshFromXof еще не означает, что загруженный меш является скелетным. Сначала вам необходимо проверить объект pSkinInfo. Если он установлен в NULL, тогда скелетный меш не был загружен. Если же он правильный объект (не NULL), тогда вам необходимо проверить существование костей.

Самым простым способом проверить наличие костей является вызов ID3DX-SkinInfo::GetNumBones. Эта функция возвращает количество костей, загруженных из шаблона Mesh. Если количество костей 0, то тогда их нет, и вы можете освобождать объект ID3DXSkinInfo (используя Release). Если же кости существуют, вы можете продолжать использована скелетного меша.

Посмотрите на этот пример, который тестирует, является ли загруженный меш скелетным. Если да, то проверяется наличие в меше костей.

// Установить флаг, если меш скелетный и есть кости

BOOL SkinnedMesh = FALSE;

if(pSkinInfo && pSkinInfo->GetNumBones())

SkinnedMesh = TRUE;

else {

// Освободить данные объекта информации скелетного меша

if(pSkinInfo) {

pSkinInfo->Release( ) ;

pSkinInfo = NULL;

}

}

Если флаг SkinnedMesh установлен в TRUE, то объект pSkinInfo является правильным, и вы готовы работать со скелетным мешем. Следующим шагом является создание еще одного объекта меша, который будет содержать меш, фактически деформируемый при изменении положения костей.

Работа со скелетными мешами || Оглавление || Создание контейнера вторичного меша