Рендеринг воды и нечто вроде metaballs
Уже около месяца в свободное время от прошедшей сессии и поездки во Владикавказ к родне я пытаюсь запрогать воду. Сейчас передо мной стоит задача отображения воды на экране. Вода - 100-200 частиц, которые движутся, взаимодействую друг с другом.
Сейчас добился немного похожего на воду вида... но всё это происходит слишком медленно.
Вот мои примеры:
100 частиц
150 частиц
200 частиц
Тут есть примеры без прорисовки воды. Скорость заметно различается...
Для рисования всего этого дела я поступаю так:
Код AS3:
var particleBitmap:BitmapData=canvas.bitmapData;
var w:uint=canvas.width;
var h:uint=canvas.height;
var rect:Rectangle=new Rectangle(0, 0, w, h);
var m:Matrix;
var i:int;
var p:BaseParticle;
particleBitmap.lock();
particleBitmap.fillRect(new Rectangle(0, 0, w, h), 0);
bubbles.clear();
for (i=0; i<ptCount; i++)
{
p=pt[i];
m=new Matrix();
m.createGradientBox(50, 50, 0, p.xx-25, p.yy-25);
bubbles.beginGradientFill(GradientType.RADIAL, [0xFF,0xFF], [1,0], [60, 255],m); //рисую полупрозрачные кружки от центра к краям
bubbles.drawCircle(p.xx, p.yy, 25);
bubbles.endFill();
}
particleBitmap.draw(bubblesShape);
particleBitmap.threshold(particleBitmap,rect, new Point(0, 0), "<", 0xA0000000); //отсекаю всё слишком прозрачное
particleBitmap.colorTransform(rect,new ColorTransform(1,1,1,1,0,0,0,255)); //убираю прозрачность
particleBitmap.unlock();
По идее код близок к metaballs, да и результат такой же. Теперь вопрос:
кто-нибудь может придумать быстрее?
|