Контроль значений particleId

Заканчивая рабочий день и собираясь поставить сцену на ночной рендер, с прискорбием обнаружил, что вымученный за последние дни сетап частиц вдруг перестал производить адекватный результат. Перед глазами стали возникать образы остывшего, затем и совсем отсутствующего ужина… мягко удаляющегося в дымку небытия дивана… лучей встающего солнца сквозь жалюзи офисного окна… Но романтические видения были гнусно прерваны обнаружением проблемы и на удивление быстрым ее решением.

Суть в том, что рождающиеся частицы по particleId равномерно привязывались у меня экспрешеном к поверхности, а теперь начали возникать непонятно где по краям. Не вдаваясь в детали конкретного сетапа, общая ситуация следующая:

Когда мы создаем частицы, настраиваем их поведение множеством пробных симуляций и наконец-то создаем initial state, диапазон  значений particleId обычно начинается с нуля и заканчивается порядковым номером последней родившейся частицы. Тут все просто и понятно.

Затем мы захотели стереть этот initial state, пересимулить частицы и запечь новый. Ставим, как обычно, Lifespan Mode в Constant и значение Lifespan в ноль – симулим фрейм и все частицы в агонии умирают – ставим initial state и получаем, казалось бы, обнуленную систему частиц. Но если нагенерить новые частицы и посмотреть их particleId, окажется, что он продолжается с последнего номера только что убиенных точек.

Обычно это не проблема, но в моем случае, когда я поочередно привязывал каждую частицу к определенной uv-координате поверхности, предполагая, что particleId начинается с нуля, экспрешен начал привязывать их к запредельным координатам и все развалилось.

Решение довольно простое – у частиц есть атрибут nextId, который хранит число для particleId следующей предполагаемой частицы. И у этого атрибута есть initial state версия, которая и запоминается при сохранении initial state частиц. Несмотря на то, что Майя будет клясться мамой, что такого атрибута у нее нет (его вроде видно только при listAttr, создании нового с таким же именем и, как ни странно, в доках), его надо занулить… Точнее его initial state версию (в целом об этом в моем предыдущем посте – http://www.sigillarium.com/blog/678/ ):

setAttr .nextId0 0;

или еще короче:

setAttr .nid0 0;

После перезапуска симуляции particleId начнется с нуля.

Подобным же образом можно контроллировать докэшивание частиц, которое наоборот может создавать новые частицы с particleId начиная от нуля (в итоге получается кэш, в котором есть частицы с одинаковым particleId – это вызывало, к примеру, проблемы при конверсии инстансера в геометрию моим скриптом – http://www.sigillarium.com/blog/726/ )

Можно создавать частицы с одинаковыми particleId или по определенному алгоритму. Тут уже понятия не имею зачем это может быть полезным, но по-любому забавно 🙂

Posted on September 25, 2010 at 19:05 by Ark · Permalink
In: FX · Tagged with: , , , , , ,

One Response

Subscribe to comments via RSS

  1. Written by Sean Wagstaff
    on 1 September 2013 at 10:32
    Permalink

    Huge help. Was scratching my head to find this. Thanks.

Subscribe to comments via RSS

Leave a Reply