Шлейфы частиц: история, ленты и трубки
Рабочая настройка, разница истории и геометрии, позы и стоимость.
Шлейф частиц деформирует геометрию по истории движения. Нужны три части: история источника, меш с подходящими trail-позами и материал поверхности с использованием шлейфов. Один длинный меш без этой настройки не является следом истории движения.
Настройте ленту
- Используйте поддерживаемый путь рендеринга. Текущий процесс относится к Forward+/Mobile; пример исполнен на Windows Forward+/Vulkan.
- Назначьте GpuParticles3D материал симуляции и заметное движение. Включите Trails → Enabled, задайте Trail Lifetime.
- Назначьте RibbonTrailMesh проходу отображения, подберите ширину и секции.
- В StandardMaterial3D включите Use Particle Trails. Проверьте и MaterialOverride: он может заменить ожидаемую настройку поверхности.
- Выберите выравнивание для движения и VisibilityAabb, охватывающий траекторию вместе с историей следа.
Запустите C#-ленту
using Reckfell;
public static class ParticleRibbon
{
public static GpuParticles3D Create()
{
var surface = new StandardMaterial3D
{
ShadingMode = BaseMaterial3D.ShadingModeEnum.Unshaded,
AlbedoColor = Colors.White,
UseParticleTrails = true,
CullMode = BaseMaterial3D.CullModeEnum.Disabled,
};
var ribbon = new RibbonTrailMesh
{
Shape = RibbonTrailMesh.ShapeEnum.Flat,
Size = 0.12f, Sections = 8, SectionLength = 0.1f,
SectionSegments = 2, Material = surface,
};
return new GpuParticles3D
{
Emitting = false, OneShot = true, Amount = 1, Lifetime = 2,
Explosiveness = 1, FixedFps = 60,
TrailEnabled = true, TrailLifetime = 0.4,
TransformAlign = GpuParticles3D.TransformAlignEnum.YToVelocity,
ProcessMaterial = new ParticleProcessMaterial
{
Direction = Vector3.Up, Spread = 0, Gravity = Vector3.Zero,
InitialVelocityMin = 1f, InitialVelocityMax = 1f,
},
DrawPass1 = ribbon,
VisibilityAabb = new Aabb(new Vector3(-3, -3, -3), new Vector3(6, 6, 6)),
};
}
}Добавьте ParticleRibbon.Create() в нужный мир и вызовите Restart возвращённого источника. Активная камера должна охватывать его. Это функциональная лента с unshaded-двусторонним материалом, а не готовый дым, художественный ассет или красивая иллюстрация. Проверка также отрисовывает TubeTrailMesh с тем же trail-материалом.
В примере Lifetime частицы равен 2 секундам, TrailLifetime — 0.4 секунды. Это разные параметры: первый задаёт жизнь частицы, второй — длительность истории. Не меняйте Lifetime, если нужна другая длина истории.
Разделяйте историю времени и исходную геометрию
| Параметр | Что меняет |
|---|---|
| TrailLifetime | Длительность используемой истории; вместе с движением влияет на видимый след. |
| Sections | Секции меша и встроенную раскладку поз. |
| SectionLength | Исходную длину секции, не универсальную итоговую мировую длину шлейфа. |
| SectionSegments ленты / SectionRings трубки | Подразделение геометрии внутри секций. |
| Size ленты / Radius трубки | Ширину/радиус поперечного сечения. |
| RadialSteps трубки | Детализацию окружности и число вершин. |
| Curve | Профиль ширины/радиуса генерируемого меша, не кривую движения частицы. |
Sections × SectionLength описывает исходный меш. Не гарантирует такую длину готового деформированного следа в мировых единицах. В нативной проверке изменение истории увеличивает видимый след без изменения этого произведения. Для равномерного движения скорость × длительность истории — полезная исходная оценка, не точная гарантия для любой кривой, шага и деформации.
Дополнительная геометрия сглаживает профиль/изгиб, но не создаёт отсутствующие шаги истории и столкновений. Проверка подтверждает рост числа вершин ленты/трубки при детализации, а не автоматическое улучшение любой сцены.
Согласуйте позы и выравнивание
RibbonTrailMesh и TubeTrailMesh предоставляют встроенные позы. Пользовательский DrawSkin может их переопределить: несвязанный skin не объединяется с ними автоматически. Несколько проходов с несовместимой раскладкой поз требуют отдельной настройки.
Flat — одна лента, Cross — перекрёстная геометрия для разных углов. На видимость всё ещё влияют culling, billboard и камера. Для трубки нужно подходящее выравнивание при изменении пути. YToVelocity — исходный вариант примера, не доказательство отсутствия артефактов на любых изгибах и при остановке.
Прозрачность задаётся реальным alpha-режимом и сортировкой поверхности. История не создаёт независимое от порядка смешивание. Видимый unshaded-тест не подтверждает нормали, освещение, швы текстуры и прозрачность готового ассета.
Не меняйте историю без необходимости
В текущем RenderingDevice изменение включения/длительности шлейфа освобождает данные частиц и сбрасывает фазу для перевыделения. Не присваивайте эти параметры каждый кадр как дешёвое затухание. Смена количества поз меша тоже может требовать перестроения данных.
Бэкенд ограничивает историю 10 секундами и отклоняет значения ниже примерно 0.01 секунды: задавайте поддерживаемый диапазон. Getter TrailLifetime сцены сохраняет запрос и не доказывает, что большее значение выделило больше истории. Ограничение сверено по исходникам; десятисекундный приёмочный тест пример не выполняет.
Стоимость зависит от вместимости, частоты симуляции, истории и числа поз/вершин. Измеряйте характерное перекрытие шлейфов. Уменьшение геометрии и уменьшение частоты симуляции сокращают разные затраты и по-разному меняют картинку.
Найдите причину дефекта
| Симптом | Что проверить |
|---|---|
| Нет правильной деформации | TrailEnabled, меш/позы и UseParticleTrails активной поверхности/override. |
| След обрезается у края камеры | VisibilityAabb должен охватывать историю, не только голову. |
| Длина не равна Sections × SectionLength | Исходная геометрия не равна итоговой истории движения. |
| Плоская лента пропадает сбоку | Камеру, culling, Flat/Cross и billboard. |
| Трубка плющится или закручивается | Выравнивание, путь, позы и секции; проверяйте движение. |
| Повторные сбросы или скачки загрузки | Изменение истории/поз и избыточные история/геометрия. |
Проверены пиксели ленты/трубки, исходная раскладка, число подразделений, изменение видимого следа от истории и стабильные пиксели на паузе. Качество сложного пути, custom skins, прозрачность при движущейся камере, другие устройства/рендереры, экспорт и производительность проверяются отдельно.