Как известно, системы частиц состоят из отдельных объектов, имеющих своими характеристиками (опционально): геометрию, время рождения, время жизни, начальное положение, скорость и еще много-много других параметров. Давайте рассмотрим, как к этому вопросу подходит известный движок трехмерной графики для 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. А дальше всё зависит от фантазии. И примеров тому уже масса даже в официальных источниках движка, например.
Комментариев нет:
Отправить комментарий