![]() 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 вызов служит как бы ВОЗДЕЙСТВИЕМ на частицу, однако тут есть проблема. Допустим у нас есть воздействие:
Ограничения с которыми мы сталкиваемся - у всех воздействий есть одинаковые ПАРАМЕТРЫ. Частицы должны иметь одинаковые заранее определенный набор СВОЙСТВ. Я не думаю что это слишком помешает нашей реализации и в конце концов их не так много если подумать. На сегодня все. Это была теория по самой частице, буду реализовывать её. Критика приветствуется ![]()
4
|
|
09.02.2010, 18:26 | |
Система частиц
Система частиц в Unity Unity3D 5: Система частиц |
|
![]() 3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
|
||||||
09.02.2010, 19:24 [ТС] | 2 | |||||
![]()
1
|
![]() 3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
|
|
12.02.2010, 15:11 [ТС] | 3 |
Итак, получилось нечто подобное. Контроль судьбы частицы\матери\группы\эффекта можно задавать через callback однако я решил делать это с помощью графиков как в Magic Particles. Я сам пришёл к тому что это более гибко, однако для этого будет необходимо создавать графики развития для каждой хар-ки частицы\матери\группы\эффекта что проблематично.
1
|
![]() 3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
|
|
08.03.2010, 23:18 [ТС] | 4 |
В ближайшее время планируется выложить работоспособную бета-версию основанную на этой концепции с подробным описанием её частей и принципов работы. Система оказалась настолько удачна (по моему мнению) что возможно будет даже редактор, правда гораздо позднее. Заглядывайте если интересно
![]()
1
|
![]() 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 Ещё пример: Код
POINT 0%, 10dg POINT 50%, 10dg / 20dg Представим что это график показывает под каким углом будет лететь частица. Ответ на вопрос "под каким она будет лететь в 25% своей жизни" поможет вам понять эту систему. Посмотрите на "срез" в 25% - частица выберет себе угол полета из заштрихованной области. Видно что она будет выбирать от 10 градусов (dg - градусы) до 15 градусов. Но чем ближе она к POINT 50% тем шире её выбор. Вот что дает interval_data ![]() И графиками управляются характеристики частицы, а именно
В самой частице есть переменная позиции частицы, однако позиция получается исключительно из характеристик угла полета, скорости полета, веса. Кроме этого нужно учитывать что частица появится не в нулевой координате а в эмиттере (прямоугольная область откуда рождаются частицы) определенным в матери частицы. Это все можно смотреть в ParticleMother.h и ParticleMother.cpp Кроме того у каждой частицы есть "родоначальные" значения для угла и скорости (можно бы и для размера, и др. характеристик сделать при надобности). Эти значения корректируют (сдвигают) графики частицы. Поясню на примере. Допустим у графика угла полета частицы сказано что она летит на 270 градусов (на юга собралась), а мать выпустила эту частицу с "родоначальной" характеристикой угла 180 градусов. Получим что она уже летит на север, бедняга... Родоначальные характеристики задаются уже в переменных ParticleMother и управляются... да да, теми же графиками. Т.е. наши частицы могут рождаться летя то туда то туда - как зададим в графике матери. Итак в целом опишу систему: В ParticleSystem хранятся объекты ParticleEffect'ов загруженных из файлов data\particles. При надобности копируются методом ParticleSystem::GetCopyOf который возвращает копию эффекта готовую для отображения. ParticleSystem так же имеет метод Render отображающий эффект переданный в качестве параметра. Но как же живет система и развивается? Все объекты более низкого уровня имеют методы Update которые вызываются и обновляют свои графики перехода на новые значения если прошло достаточное количество времени. ParticleEffect состоит из ParticleGroup. ParticleGroup - это частицы объединенные одной текстурой (иначе нельзя выводить сразу много в цикле рендера), т.е. если в эффекте (ParticleEffect) нужно использовать 3 разные текстуры придется заводить 3 разных группы ![]() ![]() На этом пока закончу, расчитываю на вопросы, что где непонятно - с удовольствием отвечу.
4
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
|
|
20.03.2010, 22:10 | 6 |
insideone, а эта технология реализут только аппаратные шейдры или программные тоже?
Кстати, можно ли сделать эту задачу при помощи GLSL-шейдеров? И, если кому поможет, вот проектик с примером шейдеров небо_шейдры.rar
1
|
![]() 3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
|
|
21.03.2010, 01:01 [ТС] | 7 |
galileopro, да нет.. шейдеры здесь не используются и это не технология, а мм... прослойка позволяющая создавать эффекты в плане который понимает обычный человек а не в том плане который делают шейдеры
![]() одном из сообщений
Собстенно это система частиц - так её называют разработчики игр...
2
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
|
|
21.03.2010, 10:17 | 8 |
А как оно их реализует? Аппаратно или программно? Просто от этого сильно зависит скорость работы. И если аппаратно - то нужно знать, каак протестировать свою видеокарту на возможности.
Вообще если это эффекты, то тут, наверное, и аппаратно и программно. Разный эффект по-разному. Если кому поможет, скоро выложу эффект огня на поверхности воды. Добавлено через 11 минут Да, я зря спросил, Render Monkey позволяет узнать какие эффекты она может рализовать аппаратно, а какие - только эмулировать. Вопрос снят.
0
|
![]() 3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
|
||||||
21.03.2010, 17:33 [ТС] | 9 | |||||
![]() Вообще я где то встречал HLSL файлы с заманчивыми названиями ParticleSystem однако так и не понял как это все делается, я пока плохо разбираюсь с шейдерами ![]() Единственное что должна поддерживать видеокарта в вышеизложенном примере - точечные спрайты, это проверяется так
5
|
21.03.2010, 17:33 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Вокселы и система частиц Примитивная система частиц? Эффективная система частиц Система инвентаря для игры Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |