Эмиссия частиц по точкам и нормалям
Генерация из меша, float-данные, цвета точек и DirectedPoints.
Points выбирает место рождения из конечного набора локальных позиций. DirectedPoints дополнительно использует нормаль ориентации каждой точки. Это текстуры данных, а не albedo, карта нормалей поверхности или живая связь с мешем.
Сгенерируйте точки из меша в редакторе
Названия ниже сверены с исходниками 1.0.0; физическая проверка этого UI в данном проходе не заявлена.
- Сначала настройте GPUParticles3D с ParticleProcessMaterial и отображаемым мешем.
- Добавьте или найдите MeshInstance3D с настоящей геометрией граней. Генератор выбирает один экземпляр меша за операцию, не произвольную иерархию Entity.
- Выделите источник частиц и в его контекстном меню используйте Create Emission Points From Entity.
- Выберите MeshInstance3D, затем число образцов и режим: Surface Points, Surface Points+Normal (Directed) либо Volume.
- Выполните генерацию, сохраните и перезапустите контролируемый эффект для проверки распределения и направления. Убедитесь, что ресурс материала не разделяется случайно с другим эффектом.
Поверхностный режим выбирает пригодные треугольники с учётом площади. Volume использует приближённый генератор на пересечениях: отдельно проверяйте незамкнутые, вогнутые и полые меши, не считая любой внутренний объём автоматически корректным. Вырожденные/пустые грани не дают полезных поверхностных образцов.
Генератор переводит меш в локальные координаты источника. Результат — снимок геометрии и взаимных трансформаций, не прикрепление к деформирующемуся мешу. При изменении геометрии или взаимного положения перегенерируйте данные, если требуется новое распределение. Движение готового источника отличается от генерации; следование живых частиц задаётся LocalCoords.
Большее число позиций-образцов расширяет доступное распределение, а не автоматически увеличивает число/плотность частиц. Amount и параметры эмиссии остаются отдельными.
Правильно упакуйте данные
| Свойство | Содержимое |
|---|---|
| EmissionPointTexture | XYZ-позиция в каждом texel; float сохраняет отрицательные координаты и диапазон. |
| EmissionNormalTexture | XYZ-направление в соответствующем texel для DirectedPoints. Нормали ненулевые, обычно единичные; это не RGB-кодированная карта нормалей поверхности. |
| EmissionColorTexture | Необязательный цвет соответствующей точки; умножается на цвет симуляции и другие источники цвета. |
| EmissionPointCount | Число допустимых образцов для выбора. Не Amount и не запрос сгенерировать отсутствующие данные. |
Шейдер индексирует позиции по строкам и использует координату текстуры позиций для нормали/цвета. Согласуйте раскладки. Текстура генератора может иметь заполнение до размера: PointCount описывает полезные образцы, а не каждый texel с padding. Не увеличивайте его сверх реальных данных. Для Points/DirectedPoints используйте положительное число.
Не храните XYZ-позиции и знаковые нормали в lossy/8-битном цветовом процессе. Не применяйте к компонентам sRGB-преобразование. Пример создаёт float ImageTexture напрямую, без импорта.
Создайте две цветные точки в 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 и все пути импорта/устройств/экспорта сверены по исходникам либо не проверены, а не объявлены полностью исполненными. Далее — Параметры материала симуляции.