Обновление иерархии

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

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

Хотя это и трудно понять сразу, сделайте так: возьмите скелетную структуру, показанную на рис. 4.2, и, начиная с корня, умножайте ее на матрицу преобразования, которая размещает корень в мире.

Обновление иерархии

Рис. 4.2. Простая скелетная структура слева использует преобразования костей справа для расположения фреймов

Как вы можете видеть на рис. 4.2, комбинированное преобразование корня применяется на все дочерние кости, которые в свою очередь тоже комбинированные. Результаты передаются дочерним костям тех костей. Однако расчет матриц преобразования показанным путем слишком труден, так что необходимы другие пути.

Самым простым способом обновления иерархии фреймов является создание рекурсивной функции, которая бы комбинировала матрицу преобразования фрейма с заданной матрицей преобразования. Далее матрица преобразования передается родственникам, а комбинированная матрица - потомкам. Посмотрите на такую функцию.

void UpdateHierarchy(D3DXFRAME_EX *Frame, \

D3DXMATRIX matTransformation = NULL)

{

D3DXFRAME_EX*pFramePtr; D3DXMATRIX matldentity;

// Использовать единичную матрицу, если ничего не было передано if(!matTransformation) {

D3DXMatrixIdentity(&matIdentity);

matTransformation = &matIdentity;

}

// Комбинировать матрицу преобразования с заданной matCombined = TransformationMatrix * (*matTransformation) ;

// Комбинировать с родственными фреймами if((pFramePtr= (D3DXFRAME_EX*)pFrameSibling)) pFramePtr->UpdateHierarchy(matTransformation);

// Комбинировать с дочерними фреймами if((pFramePtr= (D3DXFRAME_EX*)pFrameFirstChild)) pFramePtr->UpdateHierarchy(&matCombined);

}

Как вы можете здесь видеть, функция UpdateHierarchy использует в качестве первого параметра объект D3DXFRAMEEX, который является текущим обрабатываемым фреймом. Вам необходимо вызвать функцию UpdateHierarchy только один раз, задав указатель на корневой фрейм; функция рекурсивно будет вызывать сама себя для каждого фрейма.

Второй параметр UpdateHierarchy - matTransformation. Параметр matTransfor-mation является матрицей преобразования, накладываемой на преобразование фрейма. По умолчанию указатель matTransformation является NULL, означая, что будет использоваться единичная матрица при вызове UpdateHierarchy. После того как матрица фрейма комбинируется с заданным преобразованием, результирующее преобразование передается дочерним фреймам в качестве параметра matTransformation при следующих вызовах функции.

Замечание. Если вы уже читали главу 1 (наверное, читали), тогда должны были заметить, что функция UpdateHierarchy содержится в классе D3DXFRAMEEX, так что вместо вызова функции UpdateHierachy, используя в качестве параметра корневой фрейм, вы можете использовать функцию-член корневого фрейма -.-.UpdateHierarchy! Для получения дополнительной информации обэтой функции-члене читайте главу 1.

Как я уже упоминал, вам необходимо просто вызвать функцию UpdateHierarchy, используя корневой фрейм. Не указывайте матрицу преобразования в качестве второго параметра, он будет использован при рекурсивных вызовах. Если же вы зададите матрицу преобразования, весь меш будет сдвинут на нее. Это то же самое, что установить матрицу преобразования мира для расположения объекта при визуализации.

/ / рКоовЕгате = корневой фрейм-объект Р3РХЕРЪАМЕ_ЕХ ирбаиеНіегагсгіу(рКооиЕгате) ;

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

Изменение положения костей || Оглавление || Работа со скелетными мешами