Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Рендеринг воды и нечто вроде metaballs (http://www.flasher.ru/forum/showthread.php?t=127628)

Герыч 19.07.2009 01:48

Рендеринг воды и нечто вроде 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, да и результат такой же. Теперь вопрос:
кто-нибудь может придумать быстрее?

etc 19.07.2009 10:35

GlowFilter?

Герыч 19.07.2009 13:36

не, GlowFilter не тот результат даёт. Да и работает так же медленно..

WRC_S 19.07.2009 13:57

Глянь это http://www.silin.fatal.ru/#AS3/filters/ripple

Герыч 19.07.2009 15:40

последнее совсем не на ту тему...

alatar 19.07.2009 17:51

http://asluv.com/2007/09/20/interact...s3-experiment/

Яски 19.07.2009 21:09

Во флеш отрисовка очень медленная, а тем более работа с битмапой. Можно сильно ускорить алгоритм, если удастся решить задачу только математикой, без отрисовки. Т.е. аналитически находить границу воды и рисовать только ее. Можно попытаться немного ускорить алгоритм, использовав PixelBender, но не факт что ускорение будет иметь место.

Герыч 20.07.2009 00:46

Цитата:

математикой, без отрисовки
единственное, что я знаю-это metaballs. В принципе тут я делаю это же. Если это делать математикой, то выходит медленней.

Мысли были на тему metabal+marching squares. но тут опять проблема: если делать размер сетки мелким-получаем медленную прорисовку(много вычислений), если делать крупную-то marching squares будет рисовать некрасивые фигурки..

alatar 20.07.2009 00:59

Можно получить небольшой прирост оптимизацией кода. Например не создавать каждый раз новую матрицу а использовать одну во всем цикле, ну и т.п.

Герыч 20.07.2009 01:04

уже сделал) то был набросок кода, но скорость заметно не изменилась. Ещё вместо рисования одного и того же кружка в разных местах
Код AS3:

                                bubbles.beginGradientFill(GradientType.RADIAL, [0xFF,0xFF], [1,0], [60, 255],m);                    //рисую полупрозрачные кружки от центра к краям
                                bubbles.drawCircle(p.xx, p.yy, 25);
                                bubbles.endFill();

я рисую только один и перерисовываю его в нужном месте с помощью draw, но это сильно не меняет..

ещё добавлю) может я не совсем понимаю, как работает прорисовка во флэше, т.е. вообще сами Bitmap'ы и все display object'ы, но как я понял скорость работы treshold зависит от того, нарисовано ли что-нито на битмапе или нет)


Часовой пояс GMT +4, время: 04:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.