Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Статьи
        Частицы
            Движение частиц

Движение частиц

Опубликованно: 17.09.2015, 8:50
Последняя редакция, AdiDOS: 07.05.2017 8:39

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

package test;

import com.jme3.animation.LoopMode;
import com.jme3.app.SimpleApplication;
import com.jme3.cinematic.MotionPath;
import com.jme3.cinematic.events.MotionEvent;
import com.jme3.effect.ParticleEmitter;
import com.jme3.effect.ParticleMesh.Type;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.material.Material;
import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.math.Spline.SplineType;

public class TestMovingParticle extends SimpleApplication implements ActionListener {

 MotionEvent motionControl;
 MotionPath path;
 boolean enDebugShape = false;

 public static void main(String[] args) {
   new TestMovingParticle().start();

 }

 @Override
 public void simpleInitApp() {
   flyCam.setMoveSpeed(20);
   ParticleEmitter emit = new ParticleEmitter("Emitter", Type.Triangle, 300);
   emit.setGravity(0, 0, 0);
   emit.getParticleInfluencer().setVelocityVariation(1);
   emit.setLowLife(1);
   emit.setHighLife(1);
   emit.getParticleInfluencer().setInitialVelocity(new Vector3f(0, .5f, 0));
   emit.setImagesX(15);
   emit.setStartSize(1);
   emit.setEndSize(6);
   Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md");
   mat.setTexture("Texture", assetManager.loadTexture("Effects/Smoke/Smoke.png"));
   emit.setMaterial(mat);

   rootNode.attachChild(emit);
   //Назначение нажатия кнопки X
   inputManager.addListener(this, "speed");
   inputManager.addMapping("speed", new KeyTrigger(KeyInput.KEY_X));
   //Назначение нажатия кнопки C
   inputManager.addListener(this, "debugshape");
   inputManager.addMapping("debugshape", new KeyTrigger(KeyInput.KEY_C));

   createMotionPath(emit);
 }
 //Создание пути
 private void createMotionPath(Geometry moveEffects){
   path = new MotionPath();

   //Добавление точек
   path.addWayPoint(new Vector3f(10, 3, 0));
   path.addWayPoint(new Vector3f(10, 3, 10));
   path.addWayPoint(new Vector3f(-40, 3, 10));
   path.addWayPoint(new Vector3f(-40, 3, 0));
   path.addWayPoint(new Vector3f(-40, 8, 0));
   path.addWayPoint(new Vector3f(10, 8, 0));
   path.addWayPoint(new Vector3f(10, 8, 10));
   path.addWayPoint(new Vector3f(15, 8, 10));
   path.addWayPoint(new Vector3f(10, 3, 0));

   path.setPathSplineType(SplineType.CatmullRom);

   path.enableDebugShape(assetManager, rootNode);

   motionControl = new MotionEvent(moveEffects,path);
   motionControl.setDirectionType(MotionEvent.Direction.PathAndRotation);
   motionControl.setRotation(new Quaternion().fromAngleNormalAxis(-FastMath.HALF_PI, Vector3f.UNIT_Y));

   motionControl.setInitialDuration(20f);
   motionControl.setSpeed(1f);
   motionControl.setLoopMode(LoopMode.Loop);
   motionControl.play();

 }

 @Override
 public void onAction(String name, boolean isPressed, float tpf) {
   //Переключение скорости движения
   if ("speed".equals(name) && isPressed) {
     if (motionControl.getSpeed() == 1)
       motionControl.setSpeed(5);
     else
       motionControl.setSpeed(1);
   }
   //Включение и отключение отображения линий и точек пути
   if ("debugshape".equals(name) && isPressed) {
     enDebugShape = !enDebugShape;
     if (enDebugShape)
       path.disableDebugShape();
     else
       path.enableDebugShape(assetManager, rootNode);

   }

  }

}

1

2

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

 

Ну естественно сбрасываем гравитацию в ноль она нам не нужна , по умолчанию так (0.0f, 0.1f, 0.0f).


setGravity(0, 0, 0);

Скорость изменения частиц , если завысить этот параметр у нас получится что то типа само наводящей ракеты.


setVelocityVariation(1);

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


 emit.setLowLife(1);
 emit.setHighLife(1);

 

Начального скорость анимации частиц , что то подобие сбившего самолета так что лучше больше не ставить.


setInitialVelocity(new Vector3f(0, .5f, 0));

 

Ширина изображения ,  наша текстура состоит из 15 частей.

 setImagesX(15); 

 

Начальный и конечный размер анимации, я использовал чтоб увеличить в размерах.

 emit.setStartSize(1);
 emit.setEndSize(6);

 

Я думаю все ясно данный пример можно использовать в многих вещах такие как  выхлоп газа из машины , турбина самолета , шлейф ракеты и прочие.

Спасибо за внимание!!!

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

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