После того как вы создали скелетный меш, вам необходимо создать второй контейнер меша. Для чего спросите вы? Загруженный вами с помощью функции D3DXLoadSkinMeshFromXof объект скелетного меша является основной ссылкой на данные вершин меша. Т. к. эти вершины правильно расположены в соответствии с расположением костей, все запутается, если вы начнете изменять эти положения.
Давайте оставим их в покое и вместо этого создадим второй объект меша (ID3DXMesh), который будет содержать точную копию скелетного меша. Вам необходимо считать данные вершин из скелетного меша, наложить разнообразные преобразования костей и записать результирующие данные вершин в дублирующий контейнер меша (который я назвал вторичный меш или вторичный контейнер-меш), который используется при визуализации. Разумно, не правда ли?
Как я уже замечал ранее, вторичный меш в точности совпадает со скелетным мешем, начиная от количества вершин и заканчивая индексами. Самым простым методом копирования объекта скелетного меша является использование функции ID3DXMesh::CloseMeshFVF.
HRESULT ID3DXMesh::CloneMeshFVF(
DWORD Options, // Флаги атрибутов меша DWORD FVF, // FVF используемый для копирования IDirect3DDevice9 *pDevice, // Используемое 3D устройство ID3DXMesh *ppCloneMesh); // объект вторичного меша
Параметр Options функции CloneMeshFVF абсолютно такой же, как и при вызове функций D3DXLoadMeshFromX, D3DXLoadMeshFromXof и D3DXLoadSkin-MeshFromXof, так что выбирайте сами. Я рекомендую установить его в 0, но вы можете свободно изменять его.
Что касается параметра FVF, вам просто необходимо предоставить FVF объекта скелетного меша, используя его функцию GetFVF. Не забывайте также указывать правильный объект IDirect3DDevice9 и указатель на объект ID3DXMesh, который будет вашим контейнером вторичного меша.
Вот небольшой кусочек кода, иллюстрирующий копирование скелетного меша для создания вторичного меша:
// pSkinMesh = объект ID3DXMesh
ID3DXMesh *pMesh; // контейнер вторичного меша
pSkinMesh->CloneMeshFVF(0, pMesh->GetFVF() , pDevice, &pMesh) ;
Все эти разговоры о копировании напоминают мне Star Wars Episode II: Attack of the Clones. Хорошей новостью является то, что ваши скопированные меши не будут захватывать вселенную... или будут? Эти копии не способны ничего сделать без небольшой поддержки, так что давайте вернемся к работе и посмотрим, что у нас на очереди.
После создания контейнера вторичного меша пришло время нанести ваши кости на иерархию фреймов. Почему мы не сделали этого ранее, когда я рассказывал о костях и фреймах? Все просто, данные костей были загружены до вызова функции D3DXLoadSkinMeshFromXof!
⇐Загрузка скелетных мешей из .X || Оглавление || Сопоставление костей фреймам⇒