На данный момент мы посчитали разности значений координат вершин и нормалей. Следующим шагом является масштабирование каждой из этих разностей на величину комбинирования, используемую для каждого меша. Например, если вы хотите, чтобы первая анимация (открытия рта) использовала только 50 процентов разности (означая, что рот откроется только на половину), вы умножаете значения на 0.5.
Совет. В дополнение к определению процента разностей для комбинирования вы можете использовать значения комбинирования в качестве коэффициентов при ани-мировании комбинированных мешей. Постепенно увеличивая значения комбинирования со временем, вы можете получить плавную анимацию.
Для упрощения, задавайте величину комбинирования в виде двух переменных -одну для величины смешивания первого меша, а вторую для второго меша.
float Blendl =1.0г:;//Использовать 100% разностей float Blend2 =1.of;
Для комбинирования разностей вам просто необходимо умножить их на только что определенные значения комбинирования.
// Применить значения комбинирования vecPosDiffl *=Blendl;vecNormalDiff1 *=Blend1; vecPosDiff2 *=Blend2;vecNormalDiff2 *=Blend2;
После того как вы получили разности, масштабированные на коэффициенты комбинирования, вы можете сложить их, тем самым получив комбинированные значения разностей.
// Получить соответствующие значения комбинированных разностей D3DXVECTOR3vecBlendedPos =vecPosDiff1 +vecPosDiff2; D3DXVECTOR3 vecBlendedNormal=vecNormalDiff1+vecNormalDiff2 ;
Последним шагом является прибавление комбинированных разностей к координатам вершин и нормалей базового меша и сохранение результата в буфере вершин комбинированного меша.
//Прибавить разности к значениям базового меша и сохранить результат pBlendedVertices->vecPos =vecBlendedPos + \
pBaseVertices->vecPos;
// Нормализовать нормали перед сохранением!
D3DXVECTOR3 vecNormals =BlendedNormal+pBaseVertices->vecNormal; D3DXVec3Normalize(&pBlendedVertices->vecNormal, &vecNormals) ;
Все, что остается сделать, - это увеличить указатели буферов вершин для обработки следующей вершины в каждом меше, закрыть кодовый блок юг...пеХ; для завершения обработки вершин и разблокировать буферы вершин.
// Перейти к следующим вершинам рВавеУег1;1сев + +;рВ1епбебУег1;1сев + + ; рТагдев1Уегв1сев++;рТагдев2Уеггх[сев++ ; } //Следующая итерация цикла
//Разблокировать буферы вершин рВ1епбебМевЬ->ип1оскУегвехВиггег() ; рТагдев2МевЬ->ип1оскУегвехВиггег() ; рТагдев1МевЬ->ип1оскУегвехВиггег() ; рВавеМевк->ип1оскУегвехВиггег( ) ;
Вот и все! Один полостью комбинированный меш готов к визуализации! Вы должны заметить, что комбинирование двух мешей эффектно и просто, на самом деле. А что вы скажете о комбинироЁании четырех или более мешей? Вы подумаете, что я сумасшедший, но если вы посмотрите исходный код демонстрационной программы комбинирования морфируемых мешей, содержащийся на компакт диске, вы увидите, что это выполнимо! Все правильно, полный код комбинирования четырех морфируемых анимаций находится на диске и ожидает, когда вы используете его в своем проекте.
Что это, скажите вы? Вы бы выбрали более быстрый способ комбинирования мешей? Хорошо, мой друг, боги программирования услышали ваши молитвы, и скоро вы увидите как можно использовать вершинные шейдеры для выполнения всей грязной работы комбинирования за вас!
⇐Вычисление разностей || Оглавление || Создание вершинных шейдеров комбинированного морфирования⇒