Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/181: Рейтинг темы: голосов - 181, средняя оценка - 4.91
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550

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

09.02.2010, 18:26. Показов 36660. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2010, 18:26
Ответы с готовыми решениями:

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

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

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

8
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
09.02.2010, 19:24  [ТС]
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
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
12.02.2010, 15:11  [ТС]
Итак, получилось нечто подобное. Контроль судьбы частицы\матери\группы\эффекта можно задавать через callback однако я решил делать это с помощью графиков как в Magic Particles. Я сам пришёл к тому что это более гибко, однако для этого будет необходимо создавать графики развития для каждой хар-ки частицы\матери\группы\эффекта что проблематично.
Миниатюры
Система частиц (эффекты для вашей игры)  
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
08.03.2010, 23:18  [ТС]
В ближайшее время планируется выложить работоспособную бета-версию основанную на этой концепции с подробным описанием её частей и принципов работы. Система оказалась настолько удачна (по моему мнению) что возможно будет даже редактор, правда гораздо позднее. Заглядывайте если интересно
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
09.03.2010, 20:02  [ТС]
Итак не откладывая это в долгий ящик решил все таки выпустить это. К сожалению "вырвать" из проекта без лишнего не удалось и пришлось подцепить многое.
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. Синтаксис заполнения графика таков:
Code
1
POINT time[type], data[type] [/ interval_data[type]]
[] - писать не надо, это означает лишь что это можно и не писать, т.е. простейшая запись будет
Code
1
POINT 0, 1
Это означает что в начальной точке график имеет значение 1.
Ещё пример:
Code
1
2
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
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
20.03.2010, 22:10
insideone, а эта технология реализут только аппаратные шейдры или программные тоже?
Кстати, можно ли сделать эту задачу при помощи GLSL-шейдеров?
И, если кому поможет, вот проектик с примером шейдеров небо_шейдры.rar
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
21.03.2010, 01:01  [ТС]
galileopro, да нет.. шейдеры здесь не используются и это не технология, а мм... прослойка позволяющая создавать эффекты в плане который понимает обычный человек а не в том плане который делают шейдеры ну спец-эффекты всякие, взрывы, брызги и т.п. Я уже писал об этом в
одном из сообщений
Я немного неверно выразился когда начинал тему, конкретно мне нужно было создать систему частиц чтобы они сделали нужные эффекты. <...>
Возможно то что мы будем делать будет использовать HLSL а возможно и нет. Но это разные вещи.

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

Добавлено через 11 минут
Да, я зря спросил, Render Monkey позволяет узнать какие эффекты она может рализовать аппаратно, а какие - только эмулировать. Вопрос снят.
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
21.03.2010, 17:33  [ТС]
А как оно их реализует? Аппаратно или программно? Просто от этого сильно зависит скорость работы. И если аппаратно - то нужно знать, каак протестировать свою видеокарту на возможности.
Суть в том что мы допустим хотим чтобы на экране шёл снег - система эффектов позволит с помощью пары текстовых файлов без изменения кода и перекомпиляции создать его. Делается все это программно, т.е. в цикле идет заполнение буфера порциями (заполняем снежинками) а потом они отрисовываются, система просто контролирует их жизнь, как они себя ведут, сколько живут и т.д. И... никакого 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.03.2010, 17:33
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru