p Custom Force
Пользовательская сила частиц
pCustomForce — программируемая force-нода: выражения вычисляют Force X/Y/Z и Torque X/Y/Z для существующих частиц, а Number/Position controls, два image-входа, Conditions и Region дают формуле управляемые данные и область действия.
Particle data от pEmitter, pImageEmitter, pMerge или другой particle-ноды.
pCustomForce
Обзор
Что делает pCustomForce
pCustomForce ставится внутри particle-цепочки между pEmitter/pImageEmitter и pRender. Она не создаёт частицы и не выдаёт готовое RGBA-изображение: на вход приходит существующий particle-stream, выражения рассчитывают воздействие, а результат продолжает жить как particle data до pRender.
Главное отличие от pCustom — семантика изменения. pCustom напрямую переписывает particle properties вроде Position или Velocity. pCustomForce вычисляет Force и Torque, которые затем участвуют в симуляции движения и вращения. Если нужен физически интегрируемый толчок/поле, pCustomForce обычно логичнее прямого rewrite состояния через pCustom.
У pCustomForce три постоянных входа: оранжевый Particles, зелёный Image 1 и magenta Image 2. Image 1/2 предназначены для custom image calculations и pixel-read functions. Они не являются масками и не заменяют particle-stream.
В актуальном тексте Resolve 21 есть редакционная нестыковка: во введении к pCustomForce встречается фраза о «three image inputs», но раздел Inputs сразу же описывает три входа как Particles + Image 1 + Image 2. На странице используем конкретную схему из раздела Inputs: один particle input и два image inputs.
Четвёртый вход условный. Если Region переключить в Bitmap или Mesh, Fusion создаёт dynamic Region socket: Bitmap принимает 2D image/selectable channel, Mesh — 3D mesh. В документации его цвет описан как teal или white в зависимости от порядка/режима появления.
Inspector pCustomForce построен по той же логике, что и pCustom: Numbers, Positions, Setup, Intermediate и отдельный Force layer, затем общие Conditions и Region. Поэтому удобнее воспринимать ноду как маленькую программу с входными controls, подготовкой вычислений и финальными force/torque expressions.
Numbers дают восемь анимируемых Number In 1–8, которые доступны формулам как n1…n8. Это основной способ вынести амплитуду, частоту, falloff, коэффициент притяжения или torque из текста expression в понятные ручки rig.
Positions предоставляют четыре point controls Position 1–4. В связанных Custom controls используются p1…p4 components; они удобны как центры притяжения, цели, оси и опорные точки. Само введение pCustomForce в manual говорит о четырёх XY position values, тогда как описание pCustom семейства показывает XYZ-компоненты, поэтому Z-зависимые production-rig лучше один раз проверить на целевой сборке Resolve.
Setup 1–8 предназначены для общей подготовки значений один раз за кадр до per-particle расчёта. Intermediate 1–8 выполняются следующим слоем и позволяют разложить сложную математику на этапы перед Force/Torque expressions.
Resolve 21 внутренне противоречив по диапазонам result variables: UI описан как восемь Setup и восемь Intermediate полей, но разные места текста по-разному перечисляют s# и i#. Поэтому первые документированные индексы безопаснее считать базой, а high-index result variables 5–8 проверять live перед зависимым production-шаблоном.
Force tab содержит независимые выражения Force X, Force Y и Force Z. Это не новая Position и не прямое значение Velocity: формула задаёт силовое воздействие, которое изменяет движение частицы во времени. Маленькая постоянная Force поэтому накапливает эффект в playback.
Torque X/Y/Z — вращательный эквивалент пользовательской силы. Torque влияет на spin/orientation поведения частицы и особенно заметен на Bitmap/Line/NGon/других стилях, где ориентацию действительно можно увидеть; на симметричной точке эффект может быть визуально неочевиден.
Поскольку Inspector pCustomForce наследует Custom-style expression model, формулам доступны текущие particle данные и служебные переменные, используемые для расчёта: position/velocity/rotation/spin, time, age/lifespan, Number/Position controls, image coordinates и Region variables. Не путайте чтение state внутри формулы с прямой записью state — pCustomForce возвращает именно force/torque values.
Image 1/2 используются для image-driven полей. Aspect-aware coordinates pxi1/pyi1 и pxi2/pyi2 позволяют сэмплировать подключённые изображения в позиции частицы, а w1/h1 и w2/h2 помогают учитывать размер источника. Pixel-read functions семейства Custom позволяют превращать яркость/цвет карты в силу.
Region variables дают формуле контекст относительно области: rgnhit сообщает о контакте, rgndist — расстояние, condscale — силу/вес spatial condition, rgnix/y/z — позицию пересечения, rgnnx/y/z — normal поверхности. Это позволяет строить собственный falloff, отталкивание или направление поля относительно Region.
Conditions фильтруют частицы до применения пользовательской силы. Probability оценивается для каждой частицы на каждом кадре; Start/End Age задают нормализованную долю lifespan; Set Mode и Set 1–32 работают с Sets, назначенными upstream particle-нодами.
Region Mode добавляет пространственное условие. Встроенные All, Bezier, Cube, Line, Rectangle и Sphere задаются внутри Inspector и не требуют отдельного кабеля. Только Bitmap/Mesh создают dynamic Region input — его нельзя путать с постоянными Image 1/Image 2.
Для отладки сначала используйте минимальную цепочку pEmitter → pCustomForce → pRender, Probability = 1 и одну маленькую Force-компоненту. Затем добавляйте вторую ось, Torque, image sampling, Conditions и Region по одному. Так легче отличить ошибку выражения от ошибки particle topology.
Силу нужно оценивать во времени. Один кадр может выглядеть почти так же, как baseline, потому что force меняет последующее движение. Проверяйте несколько кадров playback и сравнивайте с веткой без pCustomForce; слишком большие значения быстро разгоняют particle simulation.
Image 1/Image 2 и Region могут существовать одновременно и решают разные задачи: image inputs кормят выражения данными, Region ограничивает где/когда сила применяется. Даже при всех этих входах output остаётся particle-stream, а видимый RGBA результат появляется только после pRender.
Когда применять
Создать физически интегрируемое поле силы, которого нет среди готовых particle forces.
Сделать пользовательское притяжение или отталкивание относительно Position 1–4.
Добавить процедурное колебание/ветер через time, age и Number In controls.
Управлять вращением частиц через Torque X/Y/Z.
Считать амплитуду/направление силы из Image 1 или Image 2 через pixel-read functions.
Построить Region-aware force по distance, intersection или surface normal.
Вынести коэффициенты формулы в Number In 1–8 и анимировать без редактирования expression.
Ограничить воздействие по Probability, возрасту, Sets или пространственной Region.
