Частицы (аля партиклы) — это, на сегодняшний день, один из самых передовых спецэффектов используемых в гейм девелоперском ремесле. с помощью систем частиц создаются эффекты огня, дыма, искр (вспомните half-life — красотища), брызг кровищи, оставляющих на стенах кровавые разводы. Если ты хочешь добавить в свой гейм эффектности, то частицы — это именно то, что тебе нужно ;).

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

Нижеследующие типы я буду использовать для объявления всего, что имеет три или четыре измерения. Например, вектора (x,y,z), цвет (r,g,b) или (r,g,b,a) ну и т.п.

type TGLNrf3=array[0..2] of glfloat; TGLNrf4=array[0..3] of glfloat;

Для того чтобы нам было удобнее хранить данные о каждой частице в отдельности, можно воспользоваться нижеследующей структурой:

ВСЕ ЧАСТИЦЫ В ОДНОМ РОЛИКЕ! (Майнкрафт команды)

particle = record size:TGLNrf3; //размер частицы cord:TGLNrf3; //тек. положение в пространстве napr:TGLNrf3; //вектор направления частицы grav:TGLNrf3; //вектор «гравитации». может //использоваться для создания эффекта //ветра, прилипания частиц к объекту и т.п. colr:TGLNrf4; //тек. цвет частицы в rgba dlcl:TGLNrf4; //коф. линейного изменения цвета end;

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

type TParticlesGL = class colpr:dword; //количество частиц prtcl:array of particle; //массив частиц //метод добавления новой частицы в массив procedure add_particle( new_particle:particle); //метод удаления частицы из массива //с указанием ее индекса procedure del_particle( index:word); procedure rst_particle; //метод изменения состояния procedure drw_particle; //метод отрисовки end; procedure Swap_part( var a,b:particle); implementation procedure Swap_part( var a,b:particle); var temp:particle; begin temp:=a; a:=b; b:=temp; end; //метод удаления частицы procedure TParticlGL.del_particle( index:dword); begin colpr:=colpr-1; Swap_part( prtcl[index], prtcl[colpr]); setlength( sizep,colpr); end; //метод добавления частицы procedure TParticlGL.add_particle( new_particle:particle); begin colpr:=colpr+1; setlength( sizep,colpr); prtcl[colpr-1]:=new_particle; end;

Читайте также:  Температура и жажда Майнкрафт

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

procedure TParticlGL.rst_particle; var i_integer=0; begin while icolpr do begin //сдвигаю частицу на вектор направления prtcl[i].cord[0]:=prtcl[i].cord[0]+prtcl[i].napr[0]; prtcl[i].cord[1]:=prtcl[i].cord[1]+prtcl[i].napr[1]; prtcl[i].cord[2]:=prtcl[i].cord[2]+prtcl[i].napr[2]; //меняю чвет частицы prtcl[i].colr[0]:=prtcl[i].colr[0]-prtcl[i].dlcl[0]; prtcl[i].colr[1]:=prtcl[i].colr[1]-prtcl[i].dlcl[1]; prtcl[i].colr[2]:=prtcl[i].colr[2]-prtcl[i].dlcl[2]; prtcl[i].colr[3]:=prtcl[i].colr[3]-prtcl[i].dlcl[3]; //меняю вектор направления prtcl[i].napr[0]:=prtcl[i].napr[0]+prtcl[i].grav[0]; prtcl[i].napr[1]:=prtcl[i].napr[1]+prtcl[i].grav[1]; prtcl[i].napr[2]:=prtcl[i].napr[2]+prtcl[i].grav[2]; //если частица полностью прозрачна //(невидима) то удаляю ее if colrs[i][3]=0 then del_particle( i) else i:=i+1; end; end;

Для метода отрисовки, вариантов реализации существует бесчисленное множество, но мы разберем только три:

1. Реализация биллбордами(billboard) — Именно этим способом и делаются эффекты дыма, огня и брызг крови. Каждая частица будет отдельным биллбордом с натянутой на него соответствующей текстурой.(я уделил ему особое внимание т.к. этот способ является основным среди используемых).

Реализация биллбордами: т.к. разработчиками OpenGl биллборды не предусмотрены, нам надо вычислять координаты вершин для каждой частицы самостоятельно.

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

Для начала, нам необходимо узнать сам вектор направления взгляда. можно конечно отслеживать все матричные преобразования (повороты, сдвиги). но OpenGl существенно упрощает нам нашу задачу. с помощью Glевской функции glGetfloatv() мы можем «выдернуть» текущую матрицу и достать из нее нормаль к ближней плоскости отсечения, которая и будет нашим вектором направления взгляда ;).

Для вычисления вектора направления взгляда (и не только) нам пригодится процедура нормализации вектора:

Procedure normalize( var vector:TGLNrf3); var d:single; begin d:=sqrt( vector[0]*vector[0]+ vector[1]*vector[1]+ vector[2]*vector[2]); vector[0]:=vector[0]/d; vector[1]:=vector[1]/d; vector[2]:=vector[2]/d; end;

Доползли, наконец 🙂 — вот и сама функция, возвращающая текущий вектор направления взгляда.

Далее, чтобы нарисовать биллборд, нужно знать координаты его четырех вершин в пространстве.

Читайте также:  Как заспавнить гиганта зомби в Майнкрафт

Из определения биллборда следует, что вектор направления взгляда является нормалью для каждого биллборда в сцене (на рисунке с биллбордом он так и подписан — «нормаль»), а, имея нормаль и центр массы (N) частицы, мы можем найти все четыре вершины биллборда:

p1 = N + v1; p2 = N + v2;
p3 = N — v1; p4 = N — v2;

Чтобы найти вектор v1 нужно вычислить cross product от вектора нормали и любого другого взятого с потолка вектора (в нашем случае «Z»), для нахождения вектора v2 нужно найти cross product от вектора нормали и вектора v1 (не забудьте нормализовать полученные вектора).

//функция для вычисления векторного произведения function cross_pr( a,b:TGLNrf3):TGLNrf3; begin cross_pr[0]:= a[1] * b[2] — a[2] * b[1]; cross_pr[1]:= a[2] * b[0] — a[0] * b[2]; cross_pr[2]:= a[0] * b[1] — a[1] * b[0]; end; //процедура рисующая биллборд по векторам v1 и v2 //ее надо вызывать между операторами glbegin и glend procedure draw_billboard( v1,v2:TGLNrf3;size:glfloat); begin glTexCoord2f( 0,0); glVertex3f( v1[0]*size, v1[1]*size, v1[2]*size); glTexCoord2f( 1,0); glVertex3f( v2[0]*size, v2[1]*size, v2[2]*size); glTexCoord2f( 1,1); glVertex3f( -v1[0]*size,-v1[1]*size,-v1[2]*size); glTexCoord2f( 0,1); glVertex3f( -v2[0]*size,-v2[1]*size,-v2[2]*size); end;

Теперь, когда биллборды рисовать мы умеем, давайте разберем сам метод отрисовки частиц для этой реализации:

2. Модели — а что тут непонятного? Просто в текущих координатах частицы рисуете соответствующую ей модель (пример — осколки от ракет и взорвавшихся бочек из второй кваки).

3. Просто трианглами — хоть это и примитивно, но смотрится весьма красиво (пример — искры из half-life). пожалуй, стоит рассказать о нем поподробней.

Реализация трианглами: Название говорит само за себя — каждая частица будет обычным треугольником. можно конечно просто в координатах частицы рисовать какой-нибудь полупрозрачный, вращающийся треугольник. но смысл. Давайте посмотрим, как это было сделано в half-life:

Вектор v1 будет результатом произведения вектора нормали ближней плоскости отсечения (не путать с нормалью к трианглу) на вектор направления частицы (nap), вектор v2 будет равен отрицательному значению вектора nap помноженного на некий коэффициент (пусть это будет размер частицы). зная эти вектора, мы можем вычислить координаты вершин этого триангла в пространстве:

Читайте также:  Как изменить тег игрока в Майнкрафт

p1 = N + v1; p3 = N — v1; p2 = n — (napr*size);

По полученным вершинам остается только нарисовать сам триангл (для добавления эффектности можно использовать интерполяцию цветов). просто и со вкусом 🙂 (а искры этим способом получаются просто потрясные)

Ну, вроде все, что необходимо для создания нормального particle engine, я вам поведал. Желаю всем удачи 😉

16 июня 2002 (Обновление: 23 янв 2010)

Источник: gamedev.ru

Скачать плагин BlockParticles | Добавляет эффекты в виде частиц на блоки в Майнкрафт [1.8-1.18]]

Скачать плагин BlockParticles | Добавляет эффекты в виде частиц на блоки в Майнкрафт [1.8-1.18]]

Block Particles — этот плагин добавит возможность добавить эффекты и магические частицы блоку и изменять их. Отлично подходит для сервера с любым режимом. Эффекты очень привлекательны и интересны. Легко настраивается и изменяется. Используйте это приятное дополнение на своем сервере!

Команды плагина:

/Bp Help — открыть меню помощи

/Bp list — узнать лист блоков с эффектами

/Bp Add (название) — добавить эффект блоку

/Bp Delete (название) — удалить эффект с блока

/Bp Set (название) (тип) — установить тип эффекта

/Bp Types — показать лист эффектов

/Bp Reload — перезагрузить плагин

Права плагина:

— bparticles.admin — разрешить доступ ко всем командам

Как установить плагин?

1. Скачайте плагин.

2. Возьмите скачанный файл и перенесите в папку plugins вашего сервера.

3. Перезапустите сервер.

Источник: minesborka.ru

Fancy Block Particles [1.12.2] [1.11.2] [1.10.2] [1.7.10]

Данный мод полностью переработает анимацию частиц при ломании блоков. Она станет объемной и полностью настраиваемой в специальном меню (открывается при помощи клавиши P).

Скриншоты

Видео

Как установить Fancy Block Particles

  1. Скачай и установи Minecraft Forge
  2. Скачай мод
  3. Не распаковывая, скопируй в .minecraftmods
  4. Готово

Скачать Fancy Block Particles

#СсылкаРазмерДата
Для 1.12.x
https://minecraft-inside.ru/download/95092/
177,41 КБ 27 октября 2018
Для 1.11.2
https://minecraft-inside.ru/download/95093/
177,31 КБ 27 октября 2018
Для 1.10.2
https://minecraft-inside.ru/download/95094/
177,24 КБ 27 октября 2018
Для 1.8.9
https://minecraft-inside.ru/download/95095/
142,83 КБ 27 октября 2018
Для 1.7.10
https://minecraft-inside.ru/download/95096/
136,25 КБ 27 октября 2018

Источник: minecraft-inside.ru