ZXNet эхоконференция «code.zx»
тема: Morphing
от: Vitaly Vidmirov
кому: Vasily Below
дата: 08 Dec 1998
Здрасте, здрасте Vasily!
Однажды, в студёную летнюю пору, что-то около (07-11-98/01:21:00)
писал как-то Vasily Below к All ...
VB> У меня есть 2 картинки (а именно в chunks).
VB> Может кто-нибудь кинуть алгоритм или формулы для реализации
VB> морфа?
Вот тебе простейший алгоритм для реал-тайм морфинга с изгибом:
Реализовывать не пробовал, потому как придумываю на ходу ;)
Тем не менее, работать должно...
ИК- исходная картинка
ПК- получаемая
1. Hужно сопоставить пикселя одной картинки к пикселям другой.
1.1 Hакладываем на ИК сетку:
О--О--О--О
| | | |
О--О--О--О
| | | |
О--О--О--О
Буквы "О" обозначают опорными точки (узлы сетки).
1.2 То же самое делаем и с ПК, но сетка тут будет уже не прямая,
а деформированная. Т.е. каждый квадратик ИК превратится в
соответствующее "нечто" на ПК. Можно делать всё что угодно,
с условием, что получаемые многоугольники остаются выпуклыми.
О--О--О--О
| О-О/---О
О/| |
| | |
О-О--О---О
1.3 Для каждой опорной точки вычисляем направление и шаг перемещения.
xstep(i)=(dstX(i)-srcX(i))/n
ystep(i)=(dstY(i)-srcY(i))/n
где n - кол-во кадров.
1.4 Теперь нужно сделать кое-что посложнее, а именно найти
шаг изменения цвета пикселей ИК, чтобы в финале они
превратились в пиксели ПК. Для этого каждый деформированный
четырехугольник ПК с помощью texturemapping'a преобразуем
в недеформированный, размеры которого совпадают с прямо-
угольником ИК. В итоге у нас получится как бы финальная
фаза "морфинга наоборот".
1.5 Hаходим шаг изменения цвета для каждого пикселя ИК:
cstep(x,y)=(revC(x,y)-srcC(x,y))/n
где: revC цвет соответствующего пикселя картинки из пункта 1.4
1.6 Hа этом фаза прекалькуляции закончена.
2. Делаем морфинг.
2.1 Двигаем опорные точки
xo(i)+=xstep(i)
yo(i)+=ystep(i)
2.2 Морфируем цвета
srcC(x,y)+=cstep(x,y)
2.3 По полученным опорным точкам texturemappишь это в буфер.
2.4 Усё. выводим на экран.
Как видишь, всё очень просто, но... медленно...
Hу как, потянешь ?
злобный Виталик AKA Dark/X-Trade
|