reckfellENGINE

Эмиссия частиц по точкам и нормалям

Генерация из меша, float-данные, цвета точек и DirectedPoints.

На этой странице

Points выбирает место рождения из конечного набора локальных позиций. DirectedPoints дополнительно использует нормаль ориентации каждой точки. Это текстуры данных, а не albedo, карта нормалей поверхности или живая связь с мешем.

Сгенерируйте точки из меша в редакторе

Названия ниже сверены с исходниками 1.0.0; физическая проверка этого UI в данном проходе не заявлена.

  1. Сначала настройте GPUParticles3D с ParticleProcessMaterial и отображаемым мешем.
  2. Добавьте или найдите MeshInstance3D с настоящей геометрией граней. Генератор выбирает один экземпляр меша за операцию, не произвольную иерархию Entity.
  3. Выделите источник частиц и в его контекстном меню используйте Create Emission Points From Entity.
  4. Выберите MeshInstance3D, затем число образцов и режим: Surface Points, Surface Points+Normal (Directed) либо Volume.
  5. Выполните генерацию, сохраните и перезапустите контролируемый эффект для проверки распределения и направления. Убедитесь, что ресурс материала не разделяется случайно с другим эффектом.

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

Генератор переводит меш в локальные координаты источника. Результат — снимок геометрии и взаимных трансформаций, не прикрепление к деформирующемуся мешу. При изменении геометрии или взаимного положения перегенерируйте данные, если требуется новое распределение. Движение готового источника отличается от генерации; следование живых частиц задаётся LocalCoords.

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

Правильно упакуйте данные

СвойствоСодержимое
EmissionPointTextureXYZ-позиция в каждом texel; float сохраняет отрицательные координаты и диапазон.
EmissionNormalTextureXYZ-направление в соответствующем texel для DirectedPoints. Нормали ненулевые, обычно единичные; это не RGB-кодированная карта нормалей поверхности.
EmissionColorTextureНеобязательный цвет соответствующей точки; умножается на цвет симуляции и другие источники цвета.
EmissionPointCountЧисло допустимых образцов для выбора. Не Amount и не запрос сгенерировать отсутствующие данные.

Шейдер индексирует позиции по строкам и использует координату текстуры позиций для нормали/цвета. Согласуйте раскладки. Текстура генератора может иметь заполнение до размера: PointCount описывает полезные образцы, а не каждый texel с padding. Не увеличивайте его сверх реальных данных. Для Points/DirectedPoints используйте положительное число.

Не храните XYZ-позиции и знаковые нормали в lossy/8-битном цветовом процессе. Не применяйте к компонентам sRGB-преобразование. Пример создаёт float ImageTexture напрямую, без импорта.

Создайте две цветные точки в C#

C#
using Reckfell;

public static class ParticlePointMaterial
{
    private static ImageTexture Data(Vector3 first, Vector3 second)
    {
        using var image = Image.CreateEmpty(2, 1, false, Image.Format.Rgbaf);
        image.SetPixel(0, 0, new Color(first.X, first.Y, first.Z, 1));
        image.SetPixel(1, 0, new Color(second.X, second.Y, second.Z, 1));
        return ImageTexture.CreateFromImage(image);
    }

    public static ParticleProcessMaterial Create(bool directed = false)
    {
        return new ParticleProcessMaterial
        {
            EmissionShape = directed
                ? ParticleProcessMaterial.EmissionShapeEnum.DirectedPoints
                : ParticleProcessMaterial.EmissionShapeEnum.Points,
            EmissionPointCount = 2,
            EmissionPointTexture = Data(new Vector3(-0.65f, 0, 0), new Vector3(0.65f, 0, 0)),
            EmissionNormalTexture = Data(Vector3.Left, Vector3.Right),
            EmissionColorTexture = Data(new Vector3(1, 0, 0), new Vector3(0, 0, 1)),
            // In the directed frame, local +Z corresponds to the stored normal.
            Direction = Vector3.Back,
            Spread = 0,
            InitialVelocityMin = directed ? 1f : 0f,
            InitialVelocityMax = directed ? 1f : 0f,
            Gravity = Vector3.Zero,
        };
    }
}

Назначьте ParticlePointMaterial.Create() свойству ProcessMaterial существующего источника. Задайте достаточный Amount для выбора обеих точек, видимый draw mesh, фиксированное зерно для сравнения и AABB, охватывающий позиции с движением. В стандартном материале меша включите VertexColorUseAsAlbedo и белый AlbedoColor: иначе цвета точек могут отсутствовать или окрашиваться.

Исполненная проверка использует Amount 64 при двух точках. EmissionPointCount 1 оставляет выбор первого полезного слота без изменения Amount. Две точки не означают максимум две живые частицы: много частиц может накладываться в каждой позиции.

Create(directed: true) задаёт нормаль каждой точки, нулевой Spread и базовый Direction +Z (Vector3.Back). В локальном базисе этой реализации ось следует записанной нормали, поэтому нормали влево/вправо дают проверенное движение наружу. Нормали ориентируют базис: произвольное направление, разброс и силы не обязаны давать движение строго вдоль нормали.

Не путайте масштаб раскладки и геометрии

EmissionShapeScale масштабирует локальные позиции рождения, после чего прибавляется EmissionShapeOffset. Это отличается от ScaleMin/Max, масштабирующих рисуемую геометрию. Нативная проверка уменьшает расстояние между точками вдвое через shape scale, затем независимо увеличивает геометрию через material scale.

После изменения раскладки/скорости перепроверьте VisibilityAabb. Текстура точек не обновляет границу источника автоматически. Редактирование исходного меша тоже не переписывает созданную вашим кодом ImageTexture.

Найдите причину неправильного распределения

СимптомЧто проверить
Все частицы около начала координатПолезный PointCount и float-позиции: padding/нулевые texel или обрезанные отрицательные координаты.
Нет цвета или всё белоеРаскладку цветов, Process Color и VertexColorUseAsAlbedo поверхности.
Один цвет исчезУмножение на цвет симуляции/поверхности, а не только файл текстуры.
Directed-частицы движутся вбокНормали вместе с базовым Direction, Spread и скоростью. Одна нормаль не создаёт скорость.
Меш изменён, а эмиссия нетПерегенерацию снимка или явное обновление ресурса данных.
Эффект исчез после раздвижения точекVisibilityAabb, камеру/слои, а не только текстуры.

Runtime-проверка охватывает float-данные двух точек, соответствие цветов, различие count/вместимости, направленные нормали, преобразования формы и материал на Windows Forward+/Vulkan. Извлечение в редакторе, Volume и все пути импорта/устройств/экспорта сверены по исходникам либо не проверены, а не объявлены полностью исполненными. Далее — Параметры материала симуляции.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.