Работа с частицами: гравитация, взрывы, дым

Основы частиц: что это такое и зачем они нужны

Представь, что тебе нужно создать в игре дым от костра, взрыв или падающие листья. Рисовать каждый листочек вручную — долго и неэффективно. Здесь на помощь приходят системы частиц! 🍂

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

🎮 Совет: В игровых движках (Unity, Unreal Engine) уже есть мощные редакторы частиц. Но чтобы ими хорошо пользоваться, важно понимать математику, которая стоит за их поведением.


Гравитация: заставляем частицы падать

Это самая простая и частая сила, которую мы применяем к частицам. В реальном мире гравитация заставляет объекты падать с ускорением. Мы сделаем то же самое в нашей симуляции!

Нам понадобятся две основные переменные для каждой частицы:

  • Позиция (position) — где находится частица прямо сейчас.
  • Скорость (velocity) — как быстро и в каком направлении она движется.

Скорость — это не просто число, а вектор. В 2D-пространстве его можно записать как (vx, vy), где vx — скорость по оси X, а vy — скорость по оси Y.

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

// Задаем ускорение свободного падения (по вертикальной оси Y)
gravity = 9.8

// Для каждой частицы на каждом кадре:
velocity_y = velocity_y + (gravity * deltaTime)
position_y = position_y + (velocity_y * deltaTime)

deltaTime — это время, прошедшее с предыдущего кадра. Его использование гарантирует, что движение будет выглядеть одинаково плавно, независимо от скорости компьютера.

📘 Заметка: В играх ось Y часто направлена вверх. Поэтому, чтобы объект падал вниз, мы будем вычитать значение гравитации из его скорости по Y. Все зависит от принятой в твоем движке системы координат!

Задача: Расчет позиции падающей частицы

Условие: Частица появляется на высоте 50 метров над землей (position_y = 50) и не имеет начальной скорости (velocity_y = 0). Сила гравитации равна 10 м/с². Где будет находиться частица через 2 секунды? Через 3 секунды она достигнет земли?

Пошаговое решение:

  1. Время разобьем на небольшие промежутки, например, по 1 секунде (deltaTime = 1).
  2. После первой секунды (t=1):
    • Скорость: velocity_y = 0 + (10 * 1) = 10 м/с
    • Позиция: position_y = 50 + (10 * 1) = 40 м
  3. После второй секунды (t=2):
    • Скорость: velocity_y = 10 + (10 * 1) = 20 м/с
    • Позиция: position_y = 40 + (20 * 1) = 20 м
    Ответ через 2 секунды: На высоте 20 метров.
  4. После третьей секунды (t=3):
    • Скорость: velocity_y = 20 + (10 * 1) = 30 м/с
    • Позиция: position_y = 20 + (30 * 1) = -10 м
    Частица упала ниже уровня земли (0 метров) еще до истечения 3 секунды. Значит, она достигла земли раньше.


Взрывы: создаем хаос и разлет частиц

Взрыв — это резкое высвобождение энергии, которое отбрасывает частицы во все стороны от центра. 🌋

Ключевая идея — задать каждой частице случайное направление и большую начальную скорость.

Вот упрощенный алгоритм создания взрыва:

  1. Создай в точке взрыва множество частиц.
  2. Для каждой частицы рассчитай случайный вектор направления.
    • В 2D это можно сделать, выбрав случайный угол от 0 до 360 градусов.
    • Затем преобразуй угол в компоненты скорости:
      angle = random(0, 360) // Случайный угол в градусах
      velocity_x = explosionPower * cos(angle)
      velocity_y = explosionPower * sin(angle)
              
  3. Не забудь добавить гравитацию, чтобы частицы летели по дуге и падали обратно.
  4. Со временем уменьшай их скорость (например, из-за сопротивления воздуха) и размер для правдоподобности.

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


Дым: имитация плавности и турбулентности

Дым ведет себя иначе, чем твердые частицы взрыва. Он плавный, легкий, подверженный турбулентным вихрям и поднимается вверх. ☁️

Основные принципы симуляции дыма:

  • Подъемная сила: Температура дыма выше, чем температура воздуха, поэтому он стремится вверх. Это можно смоделировать отрицательной гравитацией или постоянной силой, толкающей частицы вверх.
  • Турбулентность (завихрения): Чтобы дым не поднимался строго по прямой, добавь к его движению небольшой случайный шум каждый кадр. Это создаст эффект хаотичного движения.
    // Простейший способ добавить турбулентность
    position_x = position_x + (random() - 0.5) * turbulenceStrength
    position_y = position_y + (random() - 0.5) * turbulenceStrength
        
  • Изменение размера и прозрачности: Частицы дыма со временем должны увеличиваться (рассеиваться) и постепенно исчезать.
Скрыть рекламу навсегда

🎥 YouTube: программирование простым языком

Канал, где я спокойно и по шагам объясняю сложные темы — без заумных терминов и лишней теории.

Подходит, если раньше «не заходило», но хочется наконец понять.

▶️ Смотреть курсы на YouTube