Далее. Скорость движения потока частиц (surface flow) задается , к сожалению, не напрямую, а опосредовано - через время ее жизни (lifespan). Именно за это время частица преодолевает путь от одного края поверхности до противоположного вдоль соответствующей изопармы. В нашем простом примере все изопармы поверхности имеют одинаковую длину, которую можно измерить с помощью инструмента Arc Length Tool. У меня результаты измерения составили чуть больше 60 единиц. Тогда, задав время жизни частиц равное 10 получаем для spriteScaleX=spriteScaleY= (расстояние)/(время жизни) (соотношение между скоростью и размером спрайта) = 60/10/1.4 = 4.3

Для поверхности с длиной пробега частиц около 60 ,со временем жизни частиц 10 и размером спрайта 4.3 ходьба циркулей должна получаться без проскальзывания. Так и происходит. (В ваших примерах эти числа естественно могут быть другими, но если вычисления проделаны аккуратно, то движение без проскальзывания вам гарантировано).

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

•    у наших частиц установим значение атрибута lifespanMode в LifespanPP only;

•    добавим частицам предопределенные атрибуты spriteScaleXPP и spriteScaleYPP;

•    в creation expression добавим следующие строки:

float $length = 60; float $coeff =1.4; lifespanPP=rand(2,20);

spriteXPP=spriteScaleYPP=$length/lifespanPP/$coeff; Мы уже почти закончили, остался лишь небольшой ньюанс. Наши разнообразные по размеру циркули замечательно шагают, но делают они это где угодно, но не по дороге. Чтобы вернуть их на дорогу ( которая лежит в плоскости OXZ) необходимо позаботиться о том чтобы Y координата наших спрайтов всегда имела значение spriteScalePP*(0.5 -h) (см. рис.) Этого легко добиться, добавив и к creation expression и к runtime after dynamics expression следующие строки (в моем случае величина «зазора» h получилась равной 0.05):

float $h=0.05;

float $position[3] = position;

position = <<$position[0], spriteScaleXPP*(0.5 -$h),$position[2]>>; При желании спрайтам можно добавить вариации по цвету так же как мы это делали в предыдущем примере.

Вот и все.

Заключение

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

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

Но для общих планов альтернативы скорее всего нет.


⇐ вернуться назад |