Как создать плазменный след для космического корабля

13

Я видел много великолепно выглядящих космических игр, в которых используются похожие эффекты. Мне действительно интересно узнать, как некоторые из этих эффектов обычно выполняются.

В частности, я хочу знать, как некоторые из следов за космическими кораблями или ракетами выполняются без использования всех доступных ресурсов.

Для примеров эффекта я имею в виду скриншоты для Gimbal и даже видео по той же ссылке. Также ракеты следуют в Ether Vapor .

Это оба одинаковые методы? Я в основном интересуюсь 2D, но я не могу представить, что он будет слишком другим.

Итак, как бы мне создать такой эффект? Мы говорим о пиксельных шейдерах, смешанных режимах / фильтрах, растровых эффектах, системах частиц или как? Не совсем зависит от платформы. Я просто ищу теорию, но конкретные примеры или ссылки были бы великолепны. И чем больше деталей, тем лучше.

Адам Харт
источник

Ответы:

7

Итак, как бы мне создать такой эффект? Мы говорим о пиксельных шейдерах, смешанных режимах / фильтрах, растровых эффектах, системах частиц или как? Не совсем зависит от платформы. Я просто ищу теорию, но конкретные примеры или ссылки были бы великолепны. И чем больше деталей, тем лучше.

Все вышеперечисленное.

Если вы не изучите их исходный код, вы можете не знать точно, как они это сделали.

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

В некоторых играх используется алгоритм изогнутых линий, из которого генерируется список вершин, и выполняется небольшое текстурирование с использованием различных текстур, применяемых в двух конечных точках трассы, так что в один момент выхлоп выглядит горячим, а в другом - более прохладным и замолкает в космос.

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

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

Вот что заставит вас задуматься:

Начните выборку позиции игрока. Эти точки сформируют сегменты тела вашего следа, из которых можно построить геометрию. Хорошей идеей будет сохранить отдельный хвостовой сегмент с отдельной текстурой. Возможно, вы захотите определить, когда игрок поворачивается, и увеличить частоту этих сегментов, иначе вы получите блочные кривые. Если только это не тот эффект, который вы собираетесь получить :)

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

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

Это дает нам простой способ смоделировать этот эффект: от идеи, что эффект всегда будет уменьшаться / уменьшаться сам по себе, если не будет предоставлено больше сегментов, и играть со скоростями, чтобы предотвратить его уменьшение.

Йован
источник
4

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

Все они обычно основаны на одном из двух понятий:

  • Отслеживайте предыдущие позиции и используйте их, чтобы нарисовать хвост.
  • Отслеживайте скорость / направление и регулируйте хвост на основании этого.

Первый лучше подходит для таких вещей, как ракеты, а второй подход лучше для каких-то прикрепленных вещей, следующих за чем-то (например, хвост дракона).

Простая реализация хвостов двигателей не так уж сложна. Вам понадобится только некоторый буфер для хранения предыдущих позиций. Я не знаю, какой язык вы используете, но для этого я бы использовал кольцевой буфер или какой-то подобный буфер (быстрое удаление и вставка на концах).

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

Затем во время рисования вы просто начинаете с текущей позиции и рисуете набор линий через все точки в вашем буфере, одновременно снижая непрозрачность с каждой последующей вершиной.

Таким образом, у вас должен получиться красивый и чистый хвост. Основываясь на вашей платформе, вы можете расширить это, например, используя шейдеры или обернув некоторую красивую графику хвоста по этому пути.

Марио
источник