22 апреля 2013 г.

Системы частиц в Away3D 4.1

Как известно, системы частиц состоят из отдельных объектов, имеющих своими характеристиками (опционально): геометрию, время рождения, время жизни, начальное положение, скорость и еще много-много других параметров. Давайте рассмотрим, как к этому вопросу подходит известный движок трехмерной графики для Flash - Away3D в текущей на данный момент ветке 4.1.

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

var geometrySet:Vector.<Geometry> = new Vector.<Geometry>();
for (var i:int = 0; i < count; i++) {
 geometrySet.push( new PlaneGeometry(size, size, 1, 1, false) );
}

Здесь мы создаем count частиц с геометрией плоскости размером size×size. На данном этапе надо определиться, что Вам нужно от частиц. Напрямую Away3D позволяет задать множество параметров. Для этого мы определяем объект типа ParticleAnimationSet в конструкторе которого указываем как мы будем генерировать частицы по времени. 1-й параметр - как долго будет видно частицу, 2-й - будет ли частица использоваться повторно, 3-й - будет ли задержка между смертью и возрождением частицы. Все цифровые значения для этих флагов задаются в специальной функции, которая вызывается для каждой частицы и которую пользователь сам же и определяет:

var particleAnimationSet:ParticleAnimationSet = new ParticleAnimationSet(true, true, true);
particleAnimationSet.initParticleFunc = _initParticleProps;
private function _initParticleProps (prop:ParticleProperties):void {
 prop.startTime = Math.random() * 10;
 prop.duration = 10;
 prop.delay = 2;
}

В этой функции мы имеем доступ до свойств каждой частицы в системе через индекс prop.index и в ней же задаем другие параметры, как то положение, скорость и т.д. Но для задания других свойств необходимо в объект типа ParticleAnimationSet, определенный выше, добавить объект состояния анимации. Их в движке несколько:

  • ParticleAccelerationNode - вектор постоянного ускорения
  • ParticleBezierCurveNode - положение частицы вдоль кривой Безье
  • ParticleBillboardNode - необходимо добавить, чтобы геометрия частицы всегда была обращена к камере
  • ParticleColorNode - изменения цвета частицы
  • ParticleFollowNode - поведение следования частицы за назначенной целью
  • ParticleOrbitNode - положения частицы по круговой орбите
  • ParticleOscillatorNode - положение частицы при простых гармонических колебаниях
  • ParticlePositionNode - начальное положение частицы
  • ParticleRotateToHeadingNode - вращение для соответствия heading-вектору (?)
  • ParticleRotationalVelocityNode - начальная скорость вращения
  • ParticleScaleNode - изменение масштаба
  • ParticleSpriteSheetNode - для использования анимации кадров текстуры спрайта
  • ParticleTimeNode - для сохранения времени внутри частицы
  • ParticleUVNode - UV смещение и масштаб
  • ParticleVelocityNode - начальная скорость

Давайте зададим для примера несколько свойств:

particleAnimationSet.addAnimation(new ParticleBillboardNode());
particleAnimationSet.addAnimation(new ParticleVelocityNode(ParticlePropertiesMode.LOCAL_STATIC));
particleAnimationSet.addAnimation(new ParticlePositionNode(ParticlePropertiesMode.LOCAL_STATIC));

И, соответственно, в функции _initParticleProps для каждой частицы определим заданные значения:

prop[ParticleVelocityNode.VELOCITY_VECTOR3D] = new Vector3D(
 0,
 Math.random() * 150 + 150,
 0
);
prop[ParticlePositionNode.POSITION_VECTOR3D] = new Vector3D(
 Math.random() * 100 - 200,
 0,
 Math.random() * 100 - 200
);

Мы задали установку для поворота каждой частицы всегда перпендикулярно вектору направления камеры, случайную скорость от 150 до 300 только вверх и случайное положение частицы в плоскости xz от -100 до 100.

Для того, чтобы наша частица была видна, определим для неё материал, к примеру типа TextureMaterial с режимом смешивания ADD:

var material:TextureMaterial = new TextureMaterial(Cast.bitmapTexture(ParticleImg));
material.blendMode = BlendMode.ADD;

Далее собираем все частицы в один Mesh, подключаем к нему анимацию, добавляем на сцену и запускаем:

particleAnimator = new ParticleAnimator(particleAnimationSet);
particleMesh = new Mesh(ParticleGeometryHelper.generateGeometry(geometrySet), material);
particleMesh.animator = particleAnimator;
view.scene.addChild(particleMesh);
particleAnimator.start();

Это весь процесс создания системы частиц для Away3D 4.1. А дальше всё зависит от фантазии. И примеров тому уже масса даже в официальных источниках движка, например.

Комментариев нет:

Отправить комментарий