Как я упоминал в главе 1, скелетный меш содержит иерархию костей (скелетную структуру), которую вы можете использовать для деформации меша, к которому присоединены кости. Хотя в главе 1 и описывалось использование скелетных мешей, я оставил вопрос загрузки данных скелетных мешей для этой главы, потому что вы можете загружать их данные, только используя класс анализатора .X. К счастью для вас, вы подготовлены!
Загрузка скелетных мешей из .X файлов похожа на загрузку обычных мешей. Перечисляя объекты данных, вы можете определить, из каких из них загружать данные скелетного меша и помещать их в объект ID3DXSkinMesh.
Сюрпризом является то, что данные скелетного меша хранятся в том же объекте, где и обычные меши, - Mesh. Если объект один и тот же, то как же мы можем отличать скелетные меши от обычных?
Единственным способом, чтобы определить содержит ли объект Mesh данные скелетного меша, является использовании функции D3DXLoadSkinMeshFromXof для загрузки меша в объект ID3DXSkinMesh. После загрузки данных меша вы можете получить только что загруженный объект скелетного меша для просмотра, есть ли в нем информация о костях (которая содержится в специально встраиваемом Mesh-объекте). Если информация о костях существует, то это скелетный меш. Если костей не существует, то меш является обычным и может быть преобразован к объекту ID3DXMesh.
Я начинаю забегать вперед, так что вернемся к ID3DXSkinMesh и D3DXLoadSkin-MeshFromXof. Совсем как с обычными мешами, необходимо создать экземпляр объекта ID3DXSkinMesh.
ID3DXSkinMesh *SkinMesh = NULL;
В функции ParseObject необходимо заменить вызов D3DXLoadSkinMeshFromXofl. Вместо вызова D3DXLoadMeshFromXof будем использовать D3DXLoadSkinMesh-FromXof.
Замечание. Пользователи DirectX 8 могут вырезать строку LPD3DXBUFFER* ppEffect-Instances из вызова D3DXLoadSkinMeshFromXof.
HRESULT D3DXLoadSkinMeshFromXof( LPDIRECTXFILEDATA pXofObjMesh, DWORD Options, LPDIRECT3DDEVICE9 pDevice, LPD3DXBUFFER* ppAdjacency, LPD3DXBUFFER* ppMaterials, LPD3DXBUFFER* ppEffectInstances, DWORD* pMatOut, LPD3DXSKINMESH* ppMesh);
Я знаю, вы скажите, что D3DXLoadSkinMeshFromXof выглядит почти как D3DXLoadMeshFromXof, и вы будете правы! Загрузка скелетного меша, используя функцию D3DXLoadMeshFromXof, выглядит так:
D3DXLoadSkinMeshFromXof(pDataObj, 0, pDevice, NULL, \ &Materials, NULL, &NurrMaterials, &SkinMesh);
После того как вы вызвали D3DXLoadSkinMeshFromXof, используя правильный объект Mesh, в вашем распоряжении появляется новый объект ID3DXSkinMesh.
⇐Загрузка мешей, используя анализатор .X || Оглавление || Загрузка иерархии фреймов из .X файла⇒