PDA

Просмотр полной версии : Как граммотно создать цветовую карту для DisplaceMap?


Crash512
19.06.2008, 00:34
Доброго времени суток, господа!

Вопрос в следующем: как создаются карты для эффекта DisplacementMapFilter? Посмотрев исходник товарища iNils, я увидел, что вот такая карта (см.вниз) делает такое искажение (см.вниз-вправо). Как добиться других искажений, я плохо понял. Пытался эксперементировать с градиентов в фотошопе, но выходит всякий неадекват. Нужны мне следующие формы - (см. прикреплённый файл с формами).

var bmp = BitmapData.loadBitmap("displacementMap2");
mc.filters = [new DisplacementMapFilter(bmp, new Point(),1, 4, 0, 450, 'color',0xffffff, 0x00)];

Насколько я понял, синий цвет здесь выбран в качестве смещения координаты Х... Но как добиться идеальной нужной формы?

Если кто может помочь советом, я буду очень благодарен. Заранее всем спасибо...

Волгоградец
19.06.2008, 10:29
http://www.flasher.ru/forum/showthread.php?t=112053

silin
19.06.2008, 12:56
имхо, дешевле будет получить карту не градиентами, а через setPixel, обычной арифметикой вычисля смещение
подправленный на setPixel пример из хелпа:
import flash.filters.DisplacementMapFilter;
import flash.display.BitmapData;
import flash.geom.Point;


var txtBlock:MovieClip = createTextBlock();
var mapBitmap:BitmapData = createMap(txtBlock._width, txtBlock._height);
var filter:DisplacementMapFilter = new DisplacementMapFilter(mapBitmap, new Point(0,10), 1, 1, 0, 200, "clamp", 0, 0);

txtBlock.filters = [filter];

function createMap(w:Number, h:Number):BitmapData
{
var bmp:BitmapData = new BitmapData(w, h);
for(var i=0;i<w;i++){
for(var j=0;j<h;j++){
var r=int(128*(1+i/w*j/h));
bmp.setPixel(i,j,r<<16);
}
}
return bmp;
}

function createTextBlock():MovieClip
{
var txtBlock:MovieClip = this.createEmptyMovieClip("txtBlock", this.getNextHighestDepth());
txtBlock.createTextField("txt", this.getNextHighestDepth(), 0, 0, 0, 0);
txtBlock.txt.autoSize="left";
txtBlock.txt.text = "TEXT & filter";
txtBlock.txt.setTextFormat(new TextFormat("_sans",48,0, true));
return txtBlock;
}