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

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

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

Решение заключается в следующем – так как различные 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

Subscribe to comments via RSS

  1. Written by Rastler
    on 29 June 2009 at 11:42
    Permalink

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

  2. Written by Dreamer
    on 11 March 2011 at 20:39
    Permalink

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

  3. Written by sukumar
    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…..

  4. Written by Sagroth
    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.

Subscribe to comments via RSS

Leave a Reply