Выделите частицы и в Attribute Editor, в разделе Add Dynamic Attributes, нажмите кнопку General, чтобы добавить эти секретные атрибуты.
В закладке Particles выберите атрибуты goall) и goalV и нажмите ОК. Эти названия появятся в списке per particle атрибутов, а частицы станут лететь в одну точку.
Пытливые умы, конечно догадались, что по умолчанию значение атрибутов goalU/goalV равно нулю, поэтому с их появлением частицы начинают лететь в точку поверхности с UV-координатами (0,0). Таким образом, добавление этих двух атрибутов позволяет указать «место на поверхности», куда должна лететь каждая частица.
Примечание. Важно хорошо представлять себе, что «место на поверхности» может определяться только с помощью двух UV-координат, тех самых, по которым, как правило, накладываются текстуры. Если для NURBS-поверхностей эти координаты определены однозначно, если не сказать шикарно, то для полигонов их может не быть вовсе. Поэтому прежде, чем просить частицы полететь в определенное «место на поверхности», надо убедиться, что такое место существует. Другими словами, поверхность должна иметь адекватные UV-координаты - только тогда можно указать частицам «место приземления», находящееся в диапазоне этих UV-координат.
Если в качестве goalU или goalV указаны координаты, которые не существуют на поверхности (например, отрицательные значения), частица будет стремиться к ближайшей точке на поверхности или к точке с UV-координатами (0,0).
Откройте Creation Expression для частиц и дополните его двумя строчками:
goalPP = rand(0.5, 1.5); goalU = rand(0,1); goalV = rand(0,1); После этого частицы будут равномерно облеплять поверхность.
Чтобы лучше увидеть это, удалите одну из поверхностей, a goalWeight оставшейся увеличьте до 0.9.
В этой формуле предполагается, что UV-координаты поверхности располагаются в диапазоне от нуля до единицы. В случае NURBS-поверхностей, этот диапазон является также диапазоном изменения параметров U и V, и может быть легко идентифицирован в Attribute Editor как значения атрибутов Min Max Range U/V:
Если изменить диапазон разброса для goalU или goalV, частицы будут покрывать только часть поверхности.
Ещё раз отмечу, что назначение «места приземления» происходит в Creation Expression один раз для каждой частицы. Если бы аналогичная формула стояла в Runtime Expression, частицы бы лихорадочно носились по поверхности, меняя цель движения в каждом кадре. Если вы хотите, чтобы частицы дополнительно хаотично ползали по поверхности, в Runtime Expression надо прибавлять небольшие случайные величины к уже имеющимся (то есть определенным в Creation Expression) значениями goalU и goalV.
Например:
goalU += rand(-0.001, 0.001); goalV += rand(-0.001, 0.001); И в заключение приведу пример Creation Expression (он, кстати, может быть использован и как Runtime Expression), который заставляет частицы покрывать поверхность не хаотично, а рядами, в виде прямоугольной сетки заданной плотности (в предположении о том, что UV-координаты на объекте также представляют собой прямоугольную область, как на всех NURBS-поверхностях):