Проверка Нахождения частицы внутри объема и Влияния поля

Довольно часто возникает задача – определить находится ли частица внутри объекта и в зависимости от этого что-то с ней сделать (обычно убить :) )

Можно проверять нормаль ближайшей точки на поверхности меша, но такая проверка для каждой частицы в каждом фрейме становится крайне медленной при большом их числе. Мой приятель написал плагин, который сразу возвращает внутри ли объема координата или нет, но все равно из-за скорости калькуляций часто приходилось отказываться от этого варианта.

Решение заключается в следующем – так как различные volume fields влияют на частицу, когда та попадает в их объем, если представить объект набором таких полей и проверять действует ли хоть одно из них на частицу, можно узнать внутри ли она объекта. Разумеется, для сложных форм результат будет неточным, но можно создать стопку полей, достаточно аккуратно их передающую. В любом случае, это будет сильно быстрее :)

Итак, как же проверить влияет ли поле на частицу. На particleShape есть массив атрибутов inputForce[], к которому подключаются все поля (и разом просчитываются для оптимизации, что и позволяет получать результат быстро даже при большом кол-ве полей) – если установить к какому индексу подключено интересующее нас поле (в hypergraph):

Two volumeAxisFields are connected to inputForce array

Two volumeAxisFields are connected to inputForce array

в партикловом экспрешене можно читать его влияние на конкретную частицу и убивать ее, если оно не равно нулю:

runtimeBeforeDynamics or runtimeAfterDynamics:

vector $force1 = inputForce[1];
vector $force2 = inputForce[2];
if( `mag $force1` != 0 || `mag $force2` != 0 )
		lifespanPP = 0;

Вот простой пример применения – при столкновении с землей, стекла машины разбиваются на осколки, которые коллайдятся с землей и самой машиной:

Emitters for glass debris generation

Emitters for glass debris generation

Из-за большой скорости, небольшой дистанции и пролезания эмиттеров внутрь объекта, некоторые частицы остаются внутри и глупо скользят по внутренней стенке, пролезая наружу и значительно тормозя просчеты:

Some debris stay inside the object

Some debris stay inside the object

Подключаем пару volumeAxisField, грубо представляющих объем внутри машины, для убиения частиц вышеуказанным способом:

Two volumeAxisFields roughly represent geometry volume

Two volumeAxisFields roughly represent geometry volume

Проблемы торчащих осколков и скорости просчета разрешаются:

Debris inside the object are killed by volumeAxisFields

Debris inside the object are killed by volumeAxisFields

Сцену прилагаю:

07_ptInVolume_01.mb

4 Responses to “Проверка Нахождения частицы внутри объема и Влияния поля”

  1. Rastler - June 29, 2009

    Прикольная статейка, все очень четко и понятно… :)
    Только анимированный GIF лучше наверное на flash заменить…..

  2. Dreamer - March 11, 2011

    Очень полезная информация. Спасибо!

  3. sukumar - December 22, 2011

    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…..

  4. Sagroth - December 22, 2011

    Can’t really say anything based on this description. If you send me the scene I’ll try to figure this out.

Leave a Reply