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

jMonkeyEngine3 урок (12) — Hello Effects

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

Предыдущий: 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. Сообщите эмиттеру на сколько шагов анимации (х*у) текстура разделена.
    Текстура мусора имеет 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 шагов анимации, убедитесь, что каждый квадрат
имеет одинакового размера, как вы видите в примерах здесь.


Параметры излучателя

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

Используйте метод 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

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

Содержание

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