Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/114: Рейтинг темы: голосов - 114, средняя оценка - 4.60
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
1

Система частиц (эффекты для вашей игры)

09.02.2010, 18:26. Просмотров 22054. Ответов 8
Метки нет (Все метки)

Итак, не имея опыта в разработке такого решения я попытаюсь сейчас открыть сам процесс разработки с нуля. Начнем с структуры. Что такое эффект? Я немного неверно выразился когда начинал тему, конкретно мне нужно было создать систему частиц чтобы они сделали нужные эффекты. Однако можно рассматривать эффект в приложении к HLSL - это обработка по какому то алгоритму исходных данных что дает новое изображение, например из глади водной получим красивую реалистичную воду http://www.gamedev.ru/code/articles/?id=4361 . Если вас интересует эта тема (HLSL эффекты) то можно почитать
1. http://www.render.ru/books/sho... ook_id=729
2. http://www.intuit.ru/departmen... l/8/1.html
3. http://netlib.narod.ru/library/book0053/toc.htm
Возможно то что мы будем делать будет использовать HLSL а возможно и нет. Но это разные вещи.
Мои же изыскания будут отталкиваться от http://codesampler.com/dx9src/... cle_system т.е. создании системы частиц. Частицы этой системы как раз и создадут сам "эффект". Например эффект дождя или снега - частицы тут капля или снежинка. Для дождя и снега характерны РАЗНЫЕ поведения частиц, но не переписывать же нам кучу кода для разных ситуаций? Нет, следует сделать универсальную систему. Этим мы и попробуем заняться.

Итак как же организовать частицы? Так как мы не знаем сколько частиц будет в нашем эффекте (универсальная система) я предпологаю связать данные списком где будет 1-ая частица которая содержит указатель на следующую а та на следующую и т.д.
Кроме этого чтобы частицы могли вести себя по разному нужно делать это по принципу callback. У каждой частицы есть Update метод который будет выполнять член-callback функцию посылающую в неё себя (this) а данный callback уже изменит СВОЙСТВА (позиция, размер, вес и др.) частицы. В этом плане callback вызов служит как бы ВОЗДЕЙСТВИЕМ на частицу, однако тут есть проблема. Допустим у нас есть воздействие:
C++
1
2
3
void Wind(Particle* _this){
   // что то сделаем с Particle
}
Это замечательно, но ветер может быть разный. Дуть под разным углом, с разной силой и может вообще быть не статичный. Можно писать кучу callback-синонимов WindHeawy WindLow и т.д. однако я предлагаю другое. Т.к. это искуственная среда то не будет зазорным хранить ПАРАМЕТРЫ воздействия в самом Particle как указатель. Конечно это не совсем логично впрочем как и хранение в нем воздействия, однако для решаемой задачи это удобно. Не всегда программирование красиво описывает реальность...
Ограничения с которыми мы сталкиваемся - у всех воздействий есть одинаковые ПАРАМЕТРЫ. Частицы должны иметь одинаковые заранее определенный набор СВОЙСТВ. Я не думаю что это слишком помешает нашей реализации и в конце концов их не так много если подумать.

На сегодня все. Это была теория по самой частице, буду реализовывать её. Критика приветствуется
4
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2010, 18:26
Ответы с готовыми решениями:

Система частиц
Как сделать, что бы частицы за моим персонажем появлялись только тогда, когда я иду по земле?...

Система частиц в 2D
Всем привет!!!! подскажите пожалуйста в 2D как можно реализовать систему частиц? что то почитал...

Система частиц в Unity
Как сделать в Unity чтобы частицы появлялись и потом создавали заданный спрайт? Вот пример как...

Unity3D 5: Система частиц
1)Бросил на динамический обьект систему частиц,как результат она "стреляет" в локальной системе...

8
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
09.02.2010, 19:24  [ТС] 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Particle{
    unsigned long long Age; // возраст частицы
    unsigned long long CriticalAge; // когда частица должа будет исчезнуть
 
    D3DXVECTOR3 Pos; // позиция частицы
    unsigned short Width; // ширина
    unsigned short Height; // высота
    unsigned short Weight; // вес
    unsigned short Size; // маштаб. для более простого изменения Width \ Height
    // и может другое. например
    unsigned short Aerodynamics;
    // ...
    Influence* Infl; // конкретизированное воздействие на частицу
    void Update()
    {
        Infl->Execute(this);
    }
};
 
struct Inf_opt{
    int Power; // сила воздействия
    float Corner; // угол воздействия
    // возможно другие...
};
 
class Influence{
friend class Particle;
    Inf_opt* Settings; // настройки воздействия
    void (*Type)(Particle*, Inf_opt*); // функция реализующее алгоритм базового воздействия
    void Execute(Particle*); // функция выполнения на частице воздействия с параметрами
};
Вот так это выглядит реализованным в коде. В смысле такова структура того что я хотел сказать. Дальше разберемся как можно управлять группой частиц
1
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
12.02.2010, 15:11  [ТС] 3
Итак, получилось нечто подобное. Контроль судьбы частицы\матери\группы\эффекта можно задавать через callback однако я решил делать это с помощью графиков как в Magic Particles. Я сам пришёл к тому что это более гибко, однако для этого будет необходимо создавать графики развития для каждой хар-ки частицы\матери\группы\эффекта что проблематично.
1
Миниатюры
Система частиц (эффекты для вашей игры)  
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
08.03.2010, 23:18  [ТС] 4
В ближайшее время планируется выложить работоспособную бета-версию основанную на этой концепции с подробным описанием её частей и принципов работы. Система оказалась настолько удачна (по моему мнению) что возможно будет даже редактор, правда гораздо позднее. Заглядывайте если интересно
1
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
09.03.2010, 20:02  [ТС] 5
Итак не откладывая это в долгий ящик решил все таки выпустить это. К сожалению "вырвать" из проекта без лишнего не удалось и пришлось подцепить многое.
dx9_particle_system.rar
Использование:
1. dx9_particle_system.exe - запускать, кнопки F1, F2, F3 - для запуска 3х разных эффектов
2. Изучить папочку data\particles и data\graphs. Можно поменять разные цифры на те что в голову взбредут и посмотреть как это отразится на эффекте.
3. Исходники смотреть, можно помучать Комментов в нужных местах как правило много, я старался

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

А теперь... теория:
В целом систему можно назвать Системой частиц на точечных спрайтах
Система частиц, потому что она управляет частицами включая контроль определенных правил их рождения, жизни и смерти
На точечных спрайтах - означает то что мы используем возможность DirectX'а выводить через буфер в котором на одну частицу будет использоваться одна вершина указывающая на центр частицы
Преимущества подхода:
  • Простота для восприятия
Недостатки подхода:
  • Отсутствие произвольного изменения размера частиц, только квадратная частица любого маштаба
  • Невозможность поворота частицы на определенный угол. Я имею ввиду что частица не может крутиться вокруг своей оси-центра

В целом для меня это пока главные + и -. Насчет быстроты не знаю, врать не буду

Вывод можно посмотреть в файле ParticleSystem.cpp: HRESULT ParticleSystem::Render(ParticleEffect* RenderedEffect, float FrameTime)
Функция прорисовывает эффект, сообщая ему что с предыдущего кадра прошло FrameTime секунд

Разобравшись с системой вывода перейдём к главой по моему мнению части системы частиц - графики.
График - список точек хранящих временное развитие характеристик частицы, эмиттера и при желании - других систем.
График пожалуй не сложен для понимания. Все они лежат в папке data\graphs. Синтаксис заполнения графика таков:
Код
POINT time[type], data[type] [/ interval_data[type]]
[] - писать не надо, это означает лишь что это можно и не писать, т.е. простейшая запись будет
Код
POINT 0, 1
Это означает что в начальной точке график имеет значение 1.
Ещё пример:
Код
POINT 0%, 10dg
POINT 50%, 10dg / 20dg
В этом графике уже две точки... вернее будет даже сказать это не точки а пределы выбора значения. Проще показать на графике
Система частиц (эффекты для вашей игры)

Представим что это график показывает под каким углом будет лететь частица. Ответ на вопрос "под каким она будет лететь в 25% своей жизни" поможет вам понять эту систему. Посмотрите на "срез" в 25% - частица выберет себе угол полета из заштрихованной области. Видно что она будет выбирать от 10 градусов (dg - градусы) до 15 градусов. Но чем ближе она к POINT 50% тем шире её выбор. Вот что дает interval_data

И графиками управляются характеристики частицы, а именно
  1. Угол полета
  2. Скорость полета
  3. Вес (хехе, пожалуй неудачное название. Частица может иметь и отрицательный вес, при этом она будет воспорять вверх в небеса )
  4. Цвет частицы (пока только её альфа канал - т.е. прозрачность)
  5. Размер частицы ( N x N пикселей)
В коде это конечно же Particle.h и Particle.cpp. В Particle.h так же определен формат вершин для частиц.
В самой частице есть переменная позиции частицы, однако позиция получается исключительно из характеристик угла полета, скорости полета, веса. Кроме этого нужно учитывать что частица появится не в нулевой координате а в эмиттере (прямоугольная область откуда рождаются частицы) определенным в матери частицы. Это все можно смотреть в ParticleMother.h и ParticleMother.cpp
Кроме того у каждой частицы есть "родоначальные" значения для угла и скорости (можно бы и для размера, и др. характеристик сделать при надобности). Эти значения корректируют (сдвигают) графики частицы. Поясню на примере. Допустим у графика угла полета частицы сказано что она летит на 270 градусов (на юга собралась), а мать выпустила эту частицу с "родоначальной" характеристикой угла 180 градусов. Получим что она уже летит на север, бедняга... Родоначальные характеристики задаются уже в переменных ParticleMother и управляются... да да, теми же графиками. Т.е. наши частицы могут рождаться летя то туда то туда - как зададим в графике матери.

Итак в целом опишу систему:
В ParticleSystem хранятся объекты ParticleEffect'ов загруженных из файлов data\particles. При надобности копируются методом ParticleSystem::GetCopyOf который возвращает копию эффекта готовую для отображения. ParticleSystem так же имеет метод Render отображающий эффект переданный в качестве параметра. Но как же живет система и развивается? Все объекты более низкого уровня имеют методы Update которые вызываются и обновляют свои графики перехода на новые значения если прошло достаточное количество времени. ParticleEffect состоит из ParticleGroup. ParticleGroup - это частицы объединенные одной текстурой (иначе нельзя выводить сразу много в цикле рендера), т.е. если в эффекте (ParticleEffect) нужно использовать 3 разные текстуры придется заводить 3 разных группы НО если текстуры одни, но вы хотите сделать частицы которые двигаются по разному - это возможно, для этого в ParticleGroup нужно создать разных матерей (ParticleMother). ParticleMother управляет выпуском частицы - местом где частица родиться, какие характеристики получит при рождении. Внутри ParticleMother хранится эталонная частица которую копируют все частицы рождаемой этой матерью, но не нужно забывать что "родовые" характеристики уникальны и выдаются при рождении частицы - это можно наблюдать в методе void ParticleMother::Birthday(ParticleGroup* Society). Где Society - куда попадет рожденная частица (в какую группу - ParticleGroup). Вот и все

На этом пока закончу, расчитываю на вопросы, что где непонятно - с удовольствием отвечу.
4
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
20.03.2010, 22:10 6
insideone, а эта технология реализут только аппаратные шейдры или программные тоже?
Кстати, можно ли сделать эту задачу при помощи GLSL-шейдеров?
И, если кому поможет, вот проектик с примером шейдеров небо_шейдры.rar
1
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
21.03.2010, 01:01  [ТС] 7
galileopro, да нет.. шейдеры здесь не используются и это не технология, а мм... прослойка позволяющая создавать эффекты в плане который понимает обычный человек а не в том плане который делают шейдеры ну спец-эффекты всякие, взрывы, брызги и т.п. Я уже писал об этом в
одном из сообщений
Я немного неверно выразился когда начинал тему, конкретно мне нужно было создать систему частиц чтобы они сделали нужные эффекты. <...>
Возможно то что мы будем делать будет использовать HLSL а возможно и нет. Но это разные вещи.

Собстенно это система частиц - так её называют разработчики игр...
2
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
21.03.2010, 10:17 8
А как оно их реализует? Аппаратно или программно? Просто от этого сильно зависит скорость работы. И если аппаратно - то нужно знать, каак протестировать свою видеокарту на возможности.
Вообще если это эффекты, то тут, наверное, и аппаратно и программно. Разный эффект по-разному. Если кому поможет, скоро выложу эффект огня на поверхности воды.

Добавлено через 11 минут
Да, я зря спросил, Render Monkey позволяет узнать какие эффекты она может рализовать аппаратно, а какие - только эмулировать. Вопрос снят.
0
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
21.03.2010, 17:33  [ТС] 9
А как оно их реализует? Аппаратно или программно? Просто от этого сильно зависит скорость работы. И если аппаратно - то нужно знать, каак протестировать свою видеокарту на возможности.
Суть в том что мы допустим хотим чтобы на экране шёл снег - система эффектов позволит с помощью пары текстовых файлов без изменения кода и перекомпиляции создать его. Делается все это программно, т.е. в цикле идет заполнение буфера порциями (заполняем снежинками) а потом они отрисовываются, система просто контролирует их жизнь, как они себя ведут, сколько живут и т.д. И... никакого HLSL
Вообще я где то встречал HLSL файлы с заманчивыми названиями ParticleSystem однако так и не понял как это все делается, я пока плохо разбираюсь с шейдерами
Единственное что должна поддерживать видеокарта в вышеизложенном примере - точечные спрайты, это проверяется
так
C++
1
2
3
4
5
6
7
    // Check and see if we can change the size of point sprites 
    // in hardware by sending D3DFVF_PSIZE with the FVF.
    bool m_bDeviceSupportsPSIZE = false;
    if( d3dCaps.FVFCaps & D3DFVFCAPS_PSIZE )
        m_bDeviceSupportsPSIZE = true;
    else
        m_bDeviceSupportsPSIZE = false;
. Эта проверка лежит в D3DX.cpp в конструкторе
5
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2010, 17:33

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вокселы и система частиц
Может мне кто нибудь объяснить в чем разница вокселей и система частиц? Если создать дым или огонь...

Примитивная система частиц?
День добрый :) подскажите пожалуйста, может есть какие не особо тяжкие для понимания новичку...

Эффективная система частиц
что лучше? точки, треугольники? где почитать? ( куча посредственных статей уже была найдена гуглом)...

Система инвентаря для игры
В общем, перенёс я код,который писал на движке, в VS и мне нужна помощь. P.S. Ошибки такие же как и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.