Проверка Нахождения частицы внутри объема и Влияния поля
Довольно часто возникает задача – определить находится ли частица внутри объекта и в зависимости от этого что-то с ней сделать (обычно убить 🙂 )
Можно проверять нормаль ближайшей точки на поверхности меша, но такая проверка для каждой частицы в каждом фрейме становится крайне медленной при большом их числе. Мой приятель написал плагин, который сразу возвращает внутри ли объема координата или нет, но все равно из-за скорости калькуляций часто приходилось отказываться от этого варианта.
Решение заключается в следующем – так как различные volume fields влияют на частицу, когда та попадает в их объем, если представить объект набором таких полей и проверять действует ли хоть одно из них на частицу, можно узнать внутри ли она объекта. Разумеется, для сложных форм результат будет неточным, но можно создать стопку полей, достаточно аккуратно их передающую. В любом случае, это будет сильно быстрее 🙂
Итак, как же проверить влияет ли поле на частицу. На particleShape есть массив атрибутов inputForce[], к которому подключаются все поля (и разом просчитываются для оптимизации, что и позволяет получать результат быстро даже при большом кол-ве полей) – если установить к какому индексу подключено интересующее нас поле (в hypergraph):
в партикловом экспрешене можно читать его влияние на конкретную частицу и убивать ее, если оно не равно нулю:
runtimeBeforeDynamics or runtimeAfterDynamics:
vector $force1 = inputForce[1];
vector $force2 = inputForce[2];
if( `mag $force1` != 0 || `mag $force2` != 0 )
lifespanPP = 0;
Вот простой пример применения – при столкновении с землей, стекла машины разбиваются на осколки, которые коллайдятся с землей и самой машиной:
Из-за большой скорости, небольшой дистанции и пролезания эмиттеров внутрь объекта, некоторые частицы остаются внутри и глупо скользят по внутренней стенке, пролезая наружу и значительно тормозя просчеты:
Подключаем пару volumeAxisField, грубо представляющих объем внутри машины, для убиения частиц вышеуказанным способом:
Проблемы торчащих осколков и скорости просчета разрешаются:
Сцену прилагаю:
In: FX · Tagged with: collision, expression, field, inputForce, maya, normal, particle attribute, particles, perfomance, runtimeAfterDynamics, runtimeBeforeDynamics, volume, volumeAxisField
on 29 June 2009 at 11:42
Permalink
Прикольная статейка, все очень четко и понятно… 🙂
Только анимированный GIF лучше наверное на flash заменить…..
on 11 March 2011 at 20:39
Permalink
Очень полезная информация. Спасибо!
on 22 December 2011 at 11:11
Permalink
hi thnx for the nice tutorial….. i’m having some problem… when i run the script in expression editor… the particles is emitting fine and at once its died…. its like a flash of particle appearing and gone…. can i know wat may b the reason for this…..
on 22 December 2011 at 21:49
Permalink
Can’t really say anything based on this description. If you send me the scene I’ll try to figure this out.