Работа с частицами: гравитация, взрывы, дым
Основы частиц: что это такое и зачем они нужны
Представь, что тебе нужно создать в игре дым от костра, взрыв или падающие листья. Рисовать каждый листочек вручную — долго и неэффективно. Здесь на помощь приходят системы частиц! 🍂
Частица — это маленький независимый объект (часто это просто текстурированный квадрат — спрайт), который живет по своим простым правилам. Когда таких объектов много, они создают красивые сложные эффекты.
🎮 Совет: В игровых движках (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 секунде (deltaTime = 1).
- После первой секунды (t=1):
- Скорость:
velocity_y = 0 + (10 * 1) = 10 м/с - Позиция:
position_y = 50 + (10 * 1) = 40 м
- Скорость:
- После второй секунды (t=2):
- Скорость:
velocity_y = 10 + (10 * 1) = 20 м/с - Позиция:
position_y = 40 + (20 * 1) = 20 м
- Скорость:
- После третьей секунды (t=3):
- Скорость:
velocity_y = 20 + (10 * 1) = 30 м/с - Позиция:
position_y = 20 + (30 * 1) = -10 м
- Скорость:
Взрывы: создаем хаос и разлет частиц
Взрыв — это резкое высвобождение энергии, которое отбрасывает частицы во все стороны от центра. 🌋
Ключевая идея — задать каждой частице случайное направление и большую начальную скорость.
Вот упрощенный алгоритм создания взрыва:
- Создай в точке взрыва множество частиц.
- Для каждой частицы рассчитай случайный вектор направления.
- В 2D это можно сделать, выбрав случайный угол от 0 до 360 градусов.
- Затем преобразуй угол в компоненты скорости:
angle = random(0, 360) // Случайный угол в градусах velocity_x = explosionPower * cos(angle) velocity_y = explosionPower * sin(angle)
- Не забудь добавить гравитацию, чтобы частицы летели по дуге и падали обратно.
- Со временем уменьшай их скорость (например, из-за сопротивления воздуха) и размер для правдоподобности.
💥 Совет: Чтобы взрыв выглядел эффектнее, добавь несколько слоев частиц: крупные обломки, летящие медленнее, и мелкие пылинки, разлетающиеся очень быстро.
Дым: имитация плавности и турбулентности
Дым ведет себя иначе, чем твердые частицы взрыва. Он плавный, легкий, подверженный турбулентным вихрям и поднимается вверх. ☁️
Основные принципы симуляции дыма:
- Подъемная сила: Температура дыма выше, чем температура воздуха, поэтому он стремится вверх. Это можно смоделировать отрицательной гравитацией или постоянной силой, толкающей частицы вверх.
- Турбулентность (завихрения): Чтобы дым не поднимался строго по прямой, добавь к его движению небольшой случайный шум каждый кадр. Это создаст эффект хаотичного движения.
// Простейший способ добавить турбулентность position_x = position_x + (random() - 0.5) * turbulenceStrength position_y = position_y + (random() - 0.5) * turbulenceStrength - Изменение размера и прозрачности: Частицы дыма со временем должны увеличиваться (рассеиваться) и постепенно исчезать.