После того как вы загрузили иерархию костей, вы можете управлять ими. Для изменения положения кости вам необходимо обнаружить соответствующую ей структуру фрейма, создав функцию, которая бы рекурсивно просматривала фрейм на совпадение с именем кости. Как только он будет найден, у вас будет указатель на него, который вы можете использовать для получения доступа к матрице преобразования. Функция рекурсивного поиска может иметь такой вид:
D3DXFRAME_EX *FindFrame(D3DXFRAME_EX *Frame, char *Name) {
// Искать только не пустые имена if(Frame && Frame->Name && Name) {
// Вернуть указатель на фрейм, если имя совпадает
if(!strcmp(Frame->Name, Name)) return Frame;
}
/ / попробовать найти заданное имя в родственных фреймах if(Frame && Frame->pFrameSibling) { D3DXFRAME_EX *FramePtr = \ FindFrame((D3DXFRAME_EX*)Frame->pFrameSibling, \ Name); if(FramePtr) return FramePtr;
}
// попытаться найти имя в дочерних фреймах if(Frame && Frame->pFrameFirstChild) {
D3DXFRAME_EX *FramePtr = \
FindFrame((D3DXFRAME_EX*)Frame->pFrameFirstChild, \
Name);
if(FramePtr) return FramePtr;
}
// ничего не найдено, возвращаем NULL return NULL;
}
Замечание. Вы можете применять любые преобразования к кости в иерархии, но рекомендуется использовать только повороты. Почему только повороты?Подумайте об этом так: когда вы сгибаете локоть, он вращается. А что вы скажете, если вместо этого переместить локоть? Получится, что локоть отделится от вашей руки, чего бы вам определенно не хотелось!
Если вы хотите переместить весь меш, просто перемещайте корневую кость; это преобразование распространится на все остальные кости. А еще лучше использовать преобразование мира, чтобы двигать ваш меш-объект.
Предположим, вы хотите найти кость "Leg" используя функцию FindFrame. Вы просто указываете имя этой кости и указатель на корневой объект фрейм, как показано тут:
// pRootframe = указатель на корневой фрейм D3DXFRAME_EX D3DXFRAME_EX *Frame = FindFrame(pRootFrame, "Leg"); if(Frame) {
// Сделать что-нибудь с фреймом, как, например, заменить // одну матрицу преобразования D3DXFRAME_EX::TransformationMa-trix // на другую.
// Здесь давайте немного повернем кость
D3DXMatrixRotationY(&Frame->TransformationMatrix, 1.57f) ;
}
⇐Загрузка иерархий из .X || Оглавление || Обновление иерархии⇒