Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.22;
Скачать: CL | DM;

Вниз

Система частиц в GLScene... В смысле огонь надо сделать :)   Найти похожие ветки 

 
Galiaf ©   (2006-08-25 13:58) [0]

Здорово, тут проблемка есть одна, у меня огонь пока сделан только тот, что придлагает GLS но он уж сильно тормозной. ФПС у меня в среднем 60, но при взрыве одной бомбы я теряю половину, а уж если поставить их штук 5 в кучу, то програмка может и повиснуть совсем. Помню когда-то г-н Fosgen упоминал что система частит в GLS не хорошо сделана и он делал сам себе по потребности но так уж вышло что я не знаю как сделать свою систему частиц которая делала бы только простенький огонь(я вообщн не знаю как ее сделать) вот и решил для начала сделать на том что есть. Приблизительно у меня это выглядит так:


 for di:=0 to 3 do begin
{создаются 4 даммикуба, налаживается на них огонь и они все отправляются в 4 стороны(каждый в свою, di - направление)}
   new:=tgldummycube(eff.AddNewChild(tgldummycube));
   new.Position.SetPoint(b[0],0.5,b[1]);
   with GetOrCreateSourcePFX(new) do begin
     manager:=GLPerlinPFXManager1;
     effectscale:=1;
     ParticleInterval:=0.001;
     PositionDispersion:=1;
     case di of //расстягиваю огонь в направлении движения
       0,1: PositionDispersionRange.SetPoint(0.5,0.1,0.1);
       2,3: PositionDispersionRange.SetPoint(0.1,0.1,0.5);
     end;
     velocitymode:=svmrelative;
     enabled:=true;
   end;
   for hh:=0 to high(effects) do
//плохой массив хранящий в себе состояния всех эффектов
     if effects[hh].free then begin
       effects[hh].obj:=new;
       effects[hh].di:=di;
       effects[hh].timer:=players[lev[b[0],b[1]].who].power*2;
       effects[hh].tip:=0;
       effects[hh].free:=false;
       break
     end;
 end


После создания в каденсере происходит постоянная проверка массива effects и если он не свободен то определяется тип эффекта и что с ним делать:


procedure TForm1.handleeffects;
var
 i, j: integer;
 rox, roz, rpx, rpz: byte;
begin
 for i:=0 to high(effects) do
   if effects[i].free=false then
     with effects[i] do begin
       case tip of
         0:
           if timer>0 then begin
             case di of
               0: obj.Position.X:=obj.Position.X+0.5;
               1: obj.Position.X:=obj.Position.X-0.5;
               2: obj.Position.z:=obj.Position.z+0.5;
               3: obj.Position.z:=obj.Position.z-0.5;
             end;
           dec(timer);
           rox:=round(obj.Position.X);
           roz:=round(obj.Position.z);
           for j:=0 to countplayers-1 do begin
             rpx:=round(players[j].player.Position.x);
             rpz:=round(players[j].player.Position.z);
             if (rpx=rox) and (rpz=roz) then begin
               players[j].life:=false
             end
           end;
           if (rox>-1) and (roz>-1) and (rox<maxx) and (roz<maxz) then
             case lev[rox,roz].tip of
               0:
                 begin
                   free:=true;
                   obj.Destroy;
                   obj:=nil;
                   lev[rox,roz].tip:=-1;
                   lev[rox,roz].obj.Destroy;
                   lev[rox,roz].obj:=nil;
                 end;
               1:
                 begin
                   free:=true;
                   obj.Destroy;
                   obj:=nil;
                 end;
               2:
                 begin
                   free:=true;
                   obj.Destroy;
                   obj:=nil;
                   addtoa(rox, roz);
                 end
             end//case
           end
           else begin
             effects[i].free:=true;
             effects[i].obj.Destroy;
             effects[i].obj:=nil;
           end;
         else
           if effects[i].timer>1 then
             dec(effects[i].timer)
           else begin
             effects[i].free:=true;
             effects[i].obj.Destroy;
           end;
       end;//case
     end
end;


Массив effects должен быть длинной около полу тысячи но для одного игрока хватает и пол сотни(пока).

А, о чем это я? :) на самом деле мне нужно просто сделать замену GLS"овской системе частиц, так что бы она выполняла только роль огня и возможно не жрала бы столько ресурсов. Код привел на всякий случай, может я в чем-то сделал некрасивую ошибку и из-за этого когда появится проблема с производительностью.
Теперь жутко извиняюсь за громозткость моей просьбы. Может есть у кого идеи чем можно заменить систему частиц. Только не придлагать перечитывать Краснова, я уже этим занимаюсь :).


 
Galiaf ©   (2006-08-30 14:57) [1]

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


 
a22 ©   (2006-08-30 16:12) [2]

полигон


 
tButton ©   (2006-08-31 09:32) [3]

а ммм... я не уверен в своей правоте, но для частицы берётся полигон, разворачивается перпендикулярно оси камеры и на сий полигон текстура кладётся.


 
Galiaf ©   (2006-08-31 13:40) [4]


> разворачивается перпендикулярно оси камеры


А разве нет такой опции в OpenGL для отображения полигонов(всех объектов) все время фронтальной стороной к камере??? Мне казалось что я видел. Ведь если каждый раз рисовать полигон и рассчитывать его вектор нормали или просто похожий расчет для отображения проводить, то это уже не мало операций, имхо. И еще на сколько вершин полигон делать для того что бы на него можно было бы положить текстуру так что бы выглядел он как круглая ровная частица, наверное и трех хватит если правильно текстуру нарисоват? Я никогда подобного не делал так что даже не знаю как эту самую текстуру нарисоват, это надо в редакторе (фотошоп например) края делать прозрачными(не знаю как) или делать края другого цвета а в програме указывать этот цвет как прозрачный? Хотелось бы подробнее этот момент услышать. Есть еще в GLScene такие примеры как Particles, хотелось бы узнать не потеряю я в скорости если использую это. Спрайты еще есть, тот же вопрос, что быстрее будет выполняться?


 
tButton ©   (2006-08-31 13:57) [5]

взрыв. то бишь огонь. делаем текстуру в фотошопе.
берём чёрный квадрат.
берём инструмент "градиент" переключаем его в режим "радиальный градиент".
берём цвет переднего плана rgb(80,40,10), заднего плана - rgb(0,0,0)
делаем градиентную заливку от центра квадрата к краю
собстна всё.
добавляем шум по вкусу.

если нужен альфа-канал - обесцвечиваем и делаем "auto levels"

>  разве нет такой опции в OpenGL для отображения полигонов(всех
> объектов) все время фронтальной стороной к камере???

эт не ко мне вопрос =)
но, емнип, есть такое



Страницы: 1 вся ветка

Текущий архив: 2007.07.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
3-1177065675
_andrews_
2007-04-20 14:41
2007.07.22
BLOB to string


15-1182807045
SerJaNT
2007-06-26 01:30
2007.07.22
Вывод из WebMoney


3-1176974958
Ega23
2007-04-19 13:29
2007.07.22
Псевдо-событийная вычитка данных из БД и вокруг неё


1-1179322890
webpauk
2007-05-16 17:41
2007.07.22
Получение размера иконок


2-1182423296
Dust
2007-06-21 14:54
2007.07.22
сохранить csv (comma text or better tab dellimited text) из Data