Морфирующая анимация

Загрузить архив с примерами ЗДЕСЬ.

Как осуществляется морфинг - нужно два объекта и обязательное условие у обеих объектов должно быть одинаковое кодичество вершин. Далее используя скаляр от 0 до 1 мы интерполируем вершины обеих объектов и получаем в результате третий объект который плавно перетекает из первого объекта во второй - этот результирующий объект мы и рисуем на экране.

В данном примере мы рассмотрим морфирующую анимацию. В коде примера мы загружаем из файла модель куба. Каждая сторона куба имеет 10х10 частей размер. На экране модель куба плавно преобразуется в сферу, сфера в пирамиду, и наоборот. Нам необходимо разбить куб на 10х10 частей каждой стороны куба что бы сделать с него сферу, которая бы была похожа на сферу (если у куба мало вершин сфера получится не такой гладкой). Код примера можно загрузить /src/03.011-morphing/Morphing_Software1.

Морфирующая анимация

В следующем примере мы "на лету" создадим модель куба для морфирующей анимации (т.е. каждая сторона куба разбита на вершины). Код примера можно загрузить /src/03.011-morphing/Morphing_Software2.

Пример модели куба для морфинга (предыдущий пример) можно увидеть на рисунке ниже:

Морфирующая анимация

Пример можно загрузить из папки 00.000-src\03.011-morphing\Cube_for_Morphing1

В примере каждая из 6ти сторон куба изначально разбита на 25 частей по высоте и по ширине. Каждая часть имеет размер 2 пикселя. То есть всего размер каждой стороны куба 50х50 пикселей (25 * 2 = 50). К примеру мы построили верхнюю сторону куба- верхние два треугольника, вершины верхней стороны куба умножаем на матрицу поворота по оси X на 180 градусов- получаем нижнюю сторону куба. Таким образом получаем остальные стороны куба- умножаем вершины верхней стороны на матрицы поворота +90 и -90 по осям X и Z.

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


for ( int i = 0; i < NumCubeVerts; i++ )
{
	v = Normalize(cube_vert_buff[i]);

	v.x *= 25.0f;
	v.y *= 25.0f;
	v.z *= 25.0f;

	sphere_vert_buff[i] = v;
}

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

Теперь из модели куба нам необходимо получить пирамиду. Это делается по следующему алгоритму:


for ( int i = 0; i < NumCubeVerts; i++ )
{
	//переводим вершины от 0 до 50
	if(cube_vert_buff[i].y < 0)
		y = 25.0f + fabs(vert_buff[i].y) //получаем высоту вершины

	//переводим вершины от 0 до 50
	if(cube_vert_buff[i].y > 0)
		y = 25.0f - vert_buff[i].y

	if(cube_vert_buff[i].y == 0)
		y = 25.0f

	//вычисляем коофициент наклона стороны пирамиды
	fac = y / 50.0f;

	pyramid_vert_buff[i].x = cube_vert_buff[i].x * fac;
	pyramid_vert_buff[i].y = cube_vert_buff[i].y;
	pyramid_vert_buff[i].z = cube_vert_buff[i].z * fac;
}

В результате этих вычислений у нас получится пирамида. Теперь пирамида может участвовать в морфинге.

Второй пример модели куба для морфинга можно загрузить из папки 00.000-src\03.011-morphing\Cube_for_Morphing2

В примере у нас есть исходный куб 8 вершин и 32 индекса. Мы каждый треугольник куба разбиваем на дополнительные треугольники (делаем тесселяцию) как это было в примере с геосферой. Можете сами попробовать добавить код из этого примера куба в пример с морфингом выше.