Если постараться, то всё же можно. Сразу скажу: у меня нет готового отработанного решения, для этого требуется больше времени и больше навыков написания скриптов на MELе нежели есть у меня.
Коротко идея состоит в следущем: Траву можно получить располагая на NURBS поверхности кучу коротких штрихов (strokes) (например с помощью Auto Paint Random). С каждым штрихом будет связана своя уникальная кисть. У каждой кисти есть нужный нам в данном случае атрибут uniformForce , определяющий направление и величину внешней силы, действующей на траву наряду с turbulence forcee, имитирующей колыхание травы от ветра. По умолчанию uniformForceX=uniformForceY=uniformForceZ=0; Предположим , что с ногой персонажа, идущего по траве, связан локатор с именем Locator. Тогда можно определить составляющие uniformForce как функции расстояния между Locator и центром штриха (Stroke) , с которым связана данная кисть. При этом подразумевается, что таких штрихов много и все они достаточно короткие.
Итак, для одного штриха это будет выглядеть следующим образом.
Имя штриха - Stroke
Имя связанной с ним кисти - GrassBrush
Имя объекта, символизирующего ступню персонажа - Locator
Добавляем для GrassBrush два векторных атрибута ExtForcePos и ParentStrokePos.
Связываем в Connection Editor
Locator.center => GrassBrush.ExtForcePos
Stroke.center => ParentStrokePos
Далее открываем в AttributeEditor нашу кисть Brush и для её аттрибутов
UniformForceX, UniformForceY, UniformForceZ пишем следущее выражение:
float $ExtForceMag = .5;
float $ExtForceMaxDist = 1;
float $DistX = parentStrokePosX - ExtForcePosX;
float $DistY = parentStrokePosY - ExtForcePosY;
float $DistZ = parentStrokePosZ - ExtForcePosZ;
if ($DistX > $ExtForceMaxDist) uniformForceX = 0;
else uniformForceX = $ExtForceMag * (1-linstep(0,$ExtForceMaxDist,(parentStrokePosX - ExtForcePosX)));
if ($DistY > $ExtForceMaxDist) GrassBrush.uniformForceY = 0;
else uniformForceY = $ExtForceMag * (1-linstep(0,$ExtForceMaxDist,(parentStrokePosY - ExtForcePosY)));
if ($DistZ > $ExtForceMaxDist) GrassBrush.uniformForceZ = 0;
else uniformForceZ = $ExtForceMag * (1-linstep(0,$ExtForceMaxDist,(parentStrokePosZ - ExtForcePosZ)));
Анимируем положение Locator . Проигрываем анимацию и видим, что трава наряду с колыханием от "ветра" ещё и отклоняется при приближении к ней локатора на расстояние менее единицы.
А теперь осталось самое интересное : написать скрипт, который будет делать всё описанное выше для кучи strokes более элегантно. Каюсь, не столь силён в программировании на MELе. Поэтому оставляю сию задачу для более крутых (если кто всё же что-нибудь напишет на основе этой идеи, не забудьте поделиться скриптиком со мной) Я лишь хотел показать, что это такой эффект в принципе возможн.