Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            jMonkeyEngine3: Привет мир, Обучающая Серия
                jMonkeyEngine3 урок (12) — Hello Effects

jMonkeyEngine3 урок (12) — Hello Effects

Опубликованно: 05.04.2017, 22:22
Последняя редакция, Andry: 27.03.2018 13:19

Предыдущий: Hello Audio, Следующий: Hello Physics

Когда в игре вы видите одно из следующих действий, то за этим скорее всего стоит система частиц(particle system):

  • Огонь, пламя, искры;
  • Дождь, снег, водопад, листья;
  • Взрывы, обломки, ударная волна;
  • Пыль, туман, облака, дым;
  • Рой насекомых, метеоритные дожди;
  • Магические заклинания.

Эти элементы сцены не могут быть смоделированы с помощью сеток (моделей). В очень простых терминах:

  • Разница между взрывом и облаком пыли проявляется в скорости эффекта частиц.
  • Различие между пламенем и водопадом проявляется в направлении и цвете эффекта частиц.

Эффекты частиц могут быть анимированными (например, искры, капли) и статическими (кусты травы, пряди волосы). Эффекты не-частиц(non-particle) включают в себя цветение/свечение и размытость/остаточное изображение. В этом уроке вы узнаете, как сделать анимированные частицы (com.jme3.effect).

Для того, чтобы использовать примеры игровых ресурсов в вашем новом проекте в jMonkeyEngine SDK, щелкните [ПК мыши] ваш проект, выберите Свойства, перейдите в раздел Библиотеки, нажмите кнопку [Добавить библиотеку] и добавьте библиотеку jme3-test-data.

Пример кода

package jme3test.helloworld;
 
import com.jme3.app.SimpleApplication;
import com.jme3.effect.ParticleEmitter;
import com.jme3.effect.ParticleMesh;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
 
/** Пример 11 - как создать огонь, воду и эффект взрыва. */
public class HelloEffects extends SimpleApplication {
 
  public static void main(String[] args) {
    HelloEffects app = new HelloEffects();
    app.start();
  }
 
  @Override
  public void simpleInitApp() {
 
    ParticleEmitter fire = 
            new ParticleEmitter("Emitter", ParticleMesh.Type.Triangle, 30);
    Material mat_red = new Material(assetManager, 
            "Common/MatDefs/Misc/Particle.j3md");
    mat_red.setTexture("Texture", assetManager.loadTexture(
            "Effects/Explosion/flame.png"));
    fire.setMaterial(mat_red);
    fire.setImagesX(2); 
    fire.setImagesY(2); // 2x2 текстура анимации
    fire.setEndColor(  new ColorRGBA(1f, 0f, 0f, 1f));   // красный
    fire.setStartColor(new ColorRGBA(1f, 1f, 0f, 0.5f)); // желтый
    fire.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 2, 0));
    fire.setStartSize(1.5f);
    fire.setEndSize(0.1f);
    fire.setGravity(0, 0, 0);
    fire.setLowLife(1f);
    fire.setHighLife(3f);
    fire.getParticleInfluencer().setVelocityVariation(0.3f);
    rootNode.attachChild(fire);
 
    ParticleEmitter debris = 
            new ParticleEmitter("Debris", ParticleMesh.Type.Triangle, 10);
    Material debris_mat = new Material(assetManager, 
            "Common/MatDefs/Misc/Particle.j3md");
    debris_mat.setTexture("Texture", assetManager.loadTexture(
            "Effects/Explosion/Debris.png"));
    debris.setMaterial(debris_mat);
    debris.setImagesX(3); 
    debris.setImagesY(3); // 3x3 текстура анимации
    debris.setRotateSpeed(4);
    debris.setSelectRandomImage(true);
    debris.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 4, 0));
    debris.setStartColor(ColorRGBA.White);
    debris.setGravity(0, 6, 0);
    debris.getParticleInfluencer().setVelocityVariation(.60f);
    rootNode.attachChild(debris);
    debris.emitAllParticles();
  }
}

Вы должны увидеть взрыв, разлетающиеся обломки, и огонь. Больше примеров кода здесь.


Текстуры Анимация и Вариации

Начните с выбора материала текстуры для вашего эффекта. Если вы предоставляете эмиттер с набором текстур (см рисунок), он может использовать их либо вариативно (в произвольном порядке), либо в виде шагов анимации (фиксированный порядок).

Настройка текстур эмиттеров работает точно так же, как вы уже делали в предыдущих главах. На этот раз вы основываете материал на описании материала Particle.j3md. Давайте подробнее рассмотрим материал для эффекта Обломков.

Debris

    ParticleEmitter debris = 
            new ParticleEmitter("Debris", ParticleMesh.Type.Triangle, 10);
    Material debris_mat = new Material(assetManager, 
            "Common/MatDefs/Misc/Particle.j3md");
    debris_mat.setTexture("Texture", assetManager.loadTexture(
            "Effects/Explosion/Debris.png"));
    debris.setMaterial(debris_mat);
    debris.setImagesX(3); 
    debris.setImagesY(3); // 3x3 текстура анимации
    debris.setSelectRandomImage(true);
        ...
  1. Создадим материал и загрузим текстуру.
  2. Сообщим Излучателю(Emitter) на сколько шагов анимации (х*у) текстура разделена.
    Текстура мусора имеет 3 × 3 кадров.
  3. При желании сообщим Излучателю(Emitter) должны ли шаги анимации быть случайными или упорядоченными.
    В этом случае с обломками, кадры должны проигрываться в случайном порядке.

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

Материал огня создается таким же образом, просто используется текстура Effects/Explosion/flame.png текстуры, которая имеет 2×2 упорядоченные шаги анимации.


Текстуры частиц по умолчанию

Следующие текстуры частиц, включенных в test-data.jar. Вы можете копировать и использовать их в своих собственных эффектах.

 Путь к текстуре Размер Пред просмотр
Effects/Explosion/Debris.png  3*3 Debris
 Effects/Explosion/flame.png 2*2 flame
 Effects/Explosion/shockwave.png 1*1 shockwave
 Effects/Explosion/smoketrail.png 1*3 smoketrail
 Effects/Smoke/Smoke.png 1*15 Smoke

Скопируйте их в свою папку assets/Effects, чтобы использовать их.


Создание пользовательских текстур

Для вашей игры вы, скорее всего, будете создавать свои текстуры частиц. Посмотрите на пример огня снова.

    ParticleEmitter fire = 
            new ParticleEmitter("Emitter", ParticleMesh.Type.Triangle, 30);
    Material mat_red = new Material(assetManager, 
            "Common/MatDefs/Misc/Particle.j3md");
    mat_red.setTexture("Texture", assetManager.loadTexture(
            "Effects/Explosion/flame.png"));
    fire.setMaterial(mat_red);
    fire.setImagesX(2); 
    fire.setImagesY(2); // 2x2 текстура анимации
    fire.setEndColor(  new ColorRGBA(1f, 0f, 0f, 1f));   // красный
    fire.setStartColor(new ColorRGBA(1f, 1f, 0f, 0.5f)); // желтый

flame

Сравните текстуру с полученным эффектом.

  • Черные части изображения становятся полностью прозрачными.
  • Белые/серые части изображения являются полупрозрачными и окрашиваются.
  • Вы устанавливаете цвет с помощью setStartColor() и setEndColor().
    Для получения огня, это градиент от желтого до красного.
  • По умолчанию, анимация воспроизводится по порядку и циклично.

Создайте текстуру в градации серого в графическом редакторе, и сохраните ее в папке assets/Effects. Если вы разделяете один файл изображения на x*y шагов анимации, убедитесь, что каждый квадрат имеет одинаковый размер, как вы видите в примерах здесь.


Параметры излучателя(Emitter Parameters)

Система частиц всегда сосредоточена вокруг излучателя.

Используйте методsetShape(), чтобы изменить Фигуру Излучателя(EmitterShape):

  • EmitterPointShape(Vector3f.ZERO) — частицы испускаются из точки (по умолчанию)
  • EmitterSphereShape(Vector3f.ZERO,2f) — частицы испускаются из сферы с размером сферы
  • EmitterBoxShape(new Vector3f(-1f,-1f,-1f),new Vector3f(1f,1f,1f)) — частицы испускаются из квадратной области.

Пример:

emitter.setShape(new EmitterPointShape(Vector3f.ZERO));

Вы создаете различные эффекты путем изменения параметров излучателя:

 Параметр Метод Значение по умолчанию Описание
 число setNumParticles() N/A Максимальное количество частиц, видимых одновременно. Значение задается пользователем в конструкторе. Это влияет на плотность и длину «следа».
 скорость getParticleInfluencer().setInitialVelocity() Vector3f.ZERO Укажите вектор, как быстро частицам перемещаются и в каком направлении начинают двигаться.
 направление getParticleInfluencer().setVelocityVariation()
setFacingVelocity()
setRandomAngle()
setFaceNormal()
setRotateSpeed()
0.2f
false
false
Vector3f.NAN
0.0f
Дополнительные аксессоры, которые контролируют, в какое направление смотрят грани частиц во время полета.
 продолжительность жизни setLowLife()
setHighLife()
3f
7f
Минимальный и максимальный период времени, до исчезновения частиц.
 интенсивность выбросов setParticlesPerSec() 20 Сколько новых частицы испускается в секунду.
 цвет setStartColor()
setEndColor()
gray(серый) Установите одинаковы цвета, или два разных цвета для градиента эффекта.
 размер setStartSize()
setEndSize()
0.2f
2f
Устанавливается в два разных значения для уменьшения/увеличения размера эффекта, или же один и тот же размера для эффекта постоянно размер.
 гравитация setGravity() 0,1,0 Будут ли частицы падают вниз (положительное) или лететь вверх (отрицательное). Установите 0f для нулевой гравитации эффекта, что бы частицы парили.

Вы можете найти подробную информацию о параметрах эффекта здесь. Добавляйте и изменяйте по одному параметру за раз, и пробуйте разные значения, пока вы не получите желаемый эффект.

Используйте SceneComposer в jMonkeyEngine SDK для более легкого создания эффектов. Создайте пустую сцену и добавьте к ней объект излучатель. Изменяйте свойства излучателя и наблюдайте результаты в режиме реального времени. Вы можете сохранять созданные вами эффекты, как .j3o файлы и загружать их точно так же как сцены или модели.

Упражнения

Можете ли вы «инвертировать» эффект огня в небольшой водопад? Вот несколько советов:

  • Измените красный и желтый цвета на голубой и синий
  • Инвертируйте вектор скорости (направления), используя отрицательное число
  • Меняйте начальный и конечный размер
  • Активируйте силу гравитации, установив ее на 0,1,0

Вывод

Вы узнали что многие разнообразные эффекты, могут быть созданы путем изменения параметров и текстур, всего лишь одного общего для них всех объекта излучателя(emitter).

Теперь вы переходите к другой захватывающей главе — моделирование физики объектов. Давайте выстрелим несколькими пушечными ядрами по кирпичной стене!


Переведено для jmonkeyengine.ru, оригинал.
Автор перевода: BuGaGa, Andry

Добавить комментарий

Содержание

jMonkeyEngine.ru © 2017. Все права сохранены.