Показать сообщение отдельно
Старый 19.07.2009, 01:48
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 1  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
Cool Рендеринг воды и нечто вроде 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, да и результат такой же. Теперь вопрос:
кто-нибудь может придумать быстрее?