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

AnimationFactory

Опубликованно: 14.09.2015, 17:41
Последняя редакция, AdiDOS: 07.05.2017 9:22

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

Ради наглядного примера я взял 2 бокса и поместил в узел  Node , и поставил для себя задачу мои кубики должны переместится по определенным осям и при этом один из боксов должен вращаться определенное время , ну перейдем к реализации.

 package test;

import com.jme3.animation.AnimControl;
import com.jme3.animation.AnimationFactory;
import com.jme3.app.SimpleApplication;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.shape.Box;

public class TestAnimationFactory extends SimpleApplication {
Node model;

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

@Override
public void simpleInitApp() {
  flyCam.setMoveSpeed(20);
  createScene();
  createAmbienLight();
  createDirectionLight();

  //Создание анимации модели
  AnimationFactory animModel = new AnimationFactory(10, "anim_model", 25);
  //Добавление перемещение модели
  animModel.addTimeTranslation(5, new Vector3f(10, 0, 0));
  animModel.addTimeTranslation(10, new Vector3f(10, 5, 0));

  //Контроль анимации модели
  AnimControl contModel = new AnimControl();
  //Добавляем анимацию модели
  contModel.addAnim(animModel.buildAnimation());
  //Привязываем контроль анимации к модели
  model.addControl(contModel);

  //Создание анимации бокса
  AnimationFactory animBox1 = new AnimationFactory(8, "anim_box1", 25);
  //Добавление вращение бокса
  animBox1.addTimeRotation(8f,new Quaternion().fromAngleAxis(FastMath.PI, Vector3f.UNIT_Z));

  AnimControl contBox1 = new AnimControl();
  contBox1.addAnim(animBox1.buildAnimation());

  //Привязываем контроль анимации к бокса
  model.getChild("box1").addControl(contBox1);

  //Запуск анимации
  contModel.createChannel().setAnim("anim_model");
  contBox1.createChannel().setAnim("anim_box1");

}
//Создание боксов
private void createScene() {
  model = new Node();
  Box box1 = new Box(1, 1, 1);
  Geometry geom1 = new Geometry("box1", box1);
  geom1.setMaterial(assetManager.loadMaterial("Textures/Terrain/BrickWall/BrickWall.j3m"));
  model.attachChild(geom1);

  Box box2 = new Box(1, 1, 1);
  Geometry geom2 = new Geometry("box2", box2);
  geom2.setMaterial(assetManager.loadMaterial("Textures/Terrain/BrickWall/BrickWall2.j3m"));
  geom2.setLocalTranslation(0,0,4);
  geom2.updateModelBound();
  model.attachChild(geom2);
  rootNode.attachChild(model);
}

// Направленный свет
private void createDirectionLight() {
  DirectionalLight sun = new DirectionalLight();
  sun.setColor(ColorRGBA.White);
  sun.setDirection(new Vector3f(-1f, -1f, -3f).normalizeLocal());
  rootNode.addLight(sun);
}

// Рассеянный свет
private void createAmbienLight() {
  AmbientLight al = new AmbientLight();
  al.setColor(ColorRGBA.White.mult(1.5f));
  rootNode.addLight(al);
}

}

1

Принцип работы такой при добавлении новой точки анимации класс учитывает координаты модели , ну простыми словами допустим наша модель стоит по координатам (0,0,0) и если мы добавим addTimeTranslation(5, new Vector3f(10, 0, 0)); время 5 и позиция 10 , то наша модель будет перемещаться по оси X в течении заданного времени .

ОПИСАНИЕ ФУНКЦИЙ

Конструктор класса AnimationFactory  первый параметр это общее время анимации в секундах , второй  имя анимации и третий количество кадров в секунду (по умолчанию 30).


new AnimationFactory(10, "anim_model", 25);

Добавление точки трансформации первый параметр длительность анимации в секундах а второй координата перемещения.


addTimeTranslation(5, new Vector3f(10, 0, 0));

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


addTimeRotation(8f,new Quaternion().fromAngleAxis(FastMath.PI, Vector3f.UNIT_Z));

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


addTimeScale(float time, Vector3f scale)

Добавление контроля анимации собственно привязка к модели анимацию.


model.addControl(contModel);

Добавление анимации в класс AnimControl где функция buildAnimation строит анимацию по заданным ранее параметрам.


addAnim(animModel.buildAnimation());

Создание канала анимации и плюс функция .setAnim(«anim_model») запускает ее по заданном имени.


contModel.createChannel().setAnim("anim_model");

Данная технология очень полезна для создания анимации лифтов, кранов, подъемников и прочее ну перечислять можно бесконечно.

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

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

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