Далее проделаем ряд действий, аналогичных с теми, что мы выполнили в предыдущем примере, а именно:
• Создадим камеру, из которой мы будем наблюдать за нашей «толпой циркулей». По умолчанию она получит имя cameral. Расположим ее желаемым образом (примерно горизонтально, чтобы наши спрайты выглядели естественно)
• У shaped наших частиц ( а по умолчанию это будет particleShapel) срздадим три дополнительных атрибута camX, camY, camZ типа float и свяжем с ними атрибуты tanslateX, translated, translateZ нашей камеры cameral. Теперь частицы «знают», где находиться камера.
• Выберем тип визуализации частиц «sprites»? создадим материал типа lambert на основе заготовленной последовательности текстур circul.#### и присвоим этот материал спрайтовым частицам.
• Добавим частицам предопределенный атрибут spriteNumPP.
Теперь определим, какой именно номер спрайта должен использоваться каждой частицей. Выражение для spriteNumPP будет очень похоже на выражение из предыдущего примера, с учетом небольших отличий - номер высвечиваемого спрайта будет складываться из номера фазы цикла движения (на основе возраста частицы) и угла между вектором I скорости частицы и вектором, соединяющим местоположение частицы и камеры (поскольку | объекты имеют обыкновение двигаться «лицом» вперед, то определяющим должен быть 1 именно угол между скоростью частицы и направлением на камеру). В окончательном виде выражение для spriteNumPP выглядит так (заметим, что, как и прежде, это будет и runtime I expression и creation expression):
float $vel [3]=velocity; float $angle;
$angle=rad_to_deg(angle(<<$vel[0],0,$vel[2]>>,<<(camX-$pos[0]),0,(camZ-$pos[2])>>));
spriteNumPP=floor(20*(age*25./20.-floor(age*25/20)))+20*floor($angle/2)+l; Успешно выполнив вышеописанные действия и запустив проигрывание анимации мы, тем не менее, обнаружим как минимум два несоответствия полученного результата здравому смыслу (или как сейчас модно говорить два «бага»): во-первых, циркули парят на разной высоте над нашей поверхностью; и, во-вторых, скорость поступательного движения циркулей не соответствует длине шага, создается ощущения движения с проскальзывай ием. Можно, конечно, сделать вид, что это не «баги»,а «фичи», и завершить на этом работу со сценой, но лучше, конечно, эти несоответствия устранить.
Исходная модель циркуля имела высоту 15 единиц и за 20 кадров «проходила» 20 единиц сетки. Значит соотношение скорости ( расстояние, который циркуль проходит за 1 секунду = 25 кадром) к его высоте равно (25/20*20)/15=5/3, то есть примерно 1.67. Спрайт со scaleX=scaleY=1 - это квадратная картинка размером в одно деление сетки, но, может оказаться, что собственно картинка циркуля занимает не всю область спрайта, поэтому при вычислении соотношение скорости движения спрайта к его размеру необходимо ввести поправку на величину Н - высоту содержательной части картинки циркуля к размеру спрайта (Например, в моем случае соотношение между скоростью движения спрайта и его размером составило 1.4):