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

Анимация Мельницы

Опубликованно: 19.07.2015, 20:51
Последняя редакция, AdiDOS: 05.05.2016 9:01

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

package test;

import com.jme3.app.SimpleApplication;
import com.jme3.asset.plugins.ZipLocator;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
import com.jme3.post.filters.LightScatteringFilter;
import com.jme3.renderer.queue.RenderQueue.ShadowMode;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.shadow.PssmShadowRenderer;
import com.jme3.util.SkyFactory;
import com.jme3.util.TangentBinormalGenerator;

public class MillAnimation extends SimpleApplication{
 private Spatial scene = null;
 private Geometry blades = null;
 private Node tower = null;
 private Node oldMill = new Node();

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

 }
 //Инициализация
 @Override
 public void simpleInitApp() {
   flyCam.setMoveSpeed(200); // Скорость перемещения
   //flyCam.setDragToRotate(true); // Включаем видимость мыши

//------------------------------Загрузка мельници------------------------------------------------------------
   assetManager.registerLocator("E:/Models/oldmill.zip", ZipLocator.class);
   tower = (Node) assetManager.loadModel("tower.obj");
   blades = (Geometry) assetManager.loadModel("blades.obj");
//...........................................................................................................
//------------------------------Смещаем все по местам------------------------------------------------------------
   tower.setLocalTranslation(0, 60, 0);
   blades.setLocalTranslation(20, 47, 5);
//........................................................................................................... 

   oldMill.attachChild(tower);
   oldMill.attachChild(blades);

   oldMill.rotate(0, 2, 0);

   createScene();
   createSkyBox();
   createSun();
   rootNode.attachChild(oldMill);

 }

 public void simpleUpdate(float tpf) {
 oldMill.getChild(1).rotate(0.05f, 0, 0);
 }
 //Создаем небо
 private void createSkyBox(){
   rootNode.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/FullskiesBlueClear03.dds", false));
 }

 //Создаем ландшафт
 private void createScene(){
   Material mat = assetManager.loadMaterial("Textures/Terrain/Rocky/Rocky.j3m");
   scene = assetManager.loadModel("Models/Terrain/Terrain.mesh.xml");
   TangentBinormalGenerator.generate(((Geometry)((Node)scene).getChild(0)).getMesh());
   scene.setMaterial(mat);
   scene.setShadowMode(ShadowMode.CastAndReceive);
   scene.setLocalScale(400);
   scene.setLocalTranslation(0, -10, -120);

   rootNode.attachChild(scene);
 }
 //Создаем солнце
 private void createSun() {
   DirectionalLight sun = new DirectionalLight();
   Vector3f lightDir = new Vector3f(-0.12f, -0.3729129f, 0.74847335f);
   sun.setDirection(lightDir);
   sun.setColor(ColorRGBA.White.clone().multLocal(2));
   rootNode.addLight(sun);

   PssmShadowRenderer pssmRenderer = new PssmShadowRenderer(assetManager,1024,4);
   pssmRenderer.setDirection(lightDir);
   pssmRenderer.setShadowIntensity(0.55f);
   FilterPostProcessor fpp = new FilterPostProcessor(assetManager);

   Vector3f lightPos = lightDir.multLocal(-3000);
   LightScatteringFilter filter = new LightScatteringFilter(lightPos);
   fpp.addFilter(filter);

   viewPort.addProcessor(fpp);
 }
}

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

Подготовка 3D модели

В первую очередь нам нужен 3D редактор какой вы будете использовать это вам решать лично я пользуюсь 3Ds Max , как настроить модель под этот редактор я и буду описывать.

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

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

4 (2)

5 (2)

Теперь выделяем любой не замороженный элемент и нажимаем convert  to Editable Mesh и с права в вкладке Modify появится Модификатор Editable Mesh и там нажимаем кнопку Attach List ,  выделяем все элементы в списке и нажимаем Attach.

6 (2)

Ну и так же делаем с башней нажимаем unfreeze All выделяем лопасти и замораживаем их и соединяем башню.

7 (2)

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

Нажимаем Edit>>Transform TollBox выделяем объекты и в появившемся окне нажимаем кнопку Center.

8 (2)

Ну и последний этап это Экспорт модели ,  я модели сохранил отдельно хотя можно и одним файлом , ну короче нажимаем Export Selected и выбираем формат файла (.obj) и далее по картинке в низу.

9 (2)

Все файлы добавил я в zip архив хотя это не обязательно ну выглядит архив так.

3

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

1

2

Примечание

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

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

8 комментариев на «“Анимация Мельницы”»

  1. AdiDOS AdiDOS:

    Не знаю как в JME, но при экспорте в Panda3d в 3d maxe. Можно вешать пустышки, а в blendere теги удобно чтоб смещать объекты. Потом как нибудь напиши про вынос классов отдельно в файлы. Например небо, ландшафта и т. д. Чтоб не повторять много раз код в других уроках. Я сейчас по jave уроки смотрю по классам. Эх было бы все как в php.

  2. AdiDOS AdiDOS:

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

  3. RomaGZ:

    ява сильно на патернах завязана да и в jme есть свои формат если я не ошибаюсь то это .j3o но макс не умеет его экспортировать.

  4. RomaGZ:

    не буду спорить не использовал никогда !!

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

Содержание

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