четверг, 17 февраля 2011 г.

JMonkey: Статья 3. Работа с Asset'ами

Всем привет!

В рамках данной статьи мы научимся загружать 3D модели, а также текст в scenegraph, используя JME asset manager. Кроме того, мы рассмотрим форматы, которые использует JMonkey.

Прежде чем приступить к выполнению поставленной задачи, необходимо добавить библиотеку к созданному проекту.

Для этого щелкните правой кнопкой мыши по созданному проекту -> Properties -> Libraries -> Add Library -> jme3-test-data

Теперь мы готовы приступить к работе. Исходный код проекта выглядит следующим образом:

package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.font.BitmapText;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Box;


public class HelloAssets extends SimpleApplication {

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

@Override
public void simpleInitApp() {

Spatial teapot = assetManager.loadModel("Models/Teapot/Teapot.obj");
Material mat_default = new Material(
assetManager, "Common/MatDefs/Misc/ShowNormals.j3md");
teapot.setMaterial(mat_default);
rootNode.attachChild(teapot);

Box box = new Box(Vector3f.ZERO, 2.5f,2.5f,1.0f);
Spatial wall = new Geometry("Box", box );
Material mat_brick = new Material(
assetManager, "Common/MatDefs/Misc/SimpleTextured.j3md");
mat_brick.setTexture("m_ColorMap",
assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg"));
wall.setMaterial(mat_brick);
wall.setLocalTranslation(2.0f,-2.5f,0.0f);
rootNode.attachChild(wall);

guiNode.detachAllChildren();
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
BitmapText helloText = new BitmapText(guiFont, false);
helloText.setSize(guiFont.getCharSet().getRenderedSize());
helloText.setText("Hello World");
helloText.setLocalTranslation(300, helloText.getLineHeight(), 0);
guiNode.attachChild(helloText);

Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.mesh.xml");
ninja.scale(0.05f, 0.05f, 0.05f);
ninja.rotate(0.0f, -3.0f, 0.0f);
ninja.setLocalTranslation(0.0f, -5.0f, -2.0f);
rootNode.attachChild(ninja);

DirectionalLight sun = new DirectionalLight();
sun.setDirection(new Vector3f(-0.1f, -0.7f, -1.0f));
rootNode.addLight(sun);

}
}

Перед тем, как перейти к рассмотрению отдельных блоков кода, я бы хотел уделить внимание Asset Manager'y, который поставляется в пакете SDK JMonkey.

Основная задача любого "менеджера ресурсов", конечно же, структуризация содержимого проекта.

Asset - любой ресурс, который относится к проекту (звуки, текстуры, модели, сцены и т.д.).

Для максимального упрощения "чтения" содержимого проекта, asset'ы могут быть распределены по категориям (models, sounds, scenes .....)

Теперь пришло время перейти непосредственно к рассмотрению кода проекта.

Создаем фрагмент стены:

Box box = new Box(Vector3f.ZERO, 2.5f,2.5f,1.0f);
Spatial wall = new Geometry("Box", box );
Material mat_brick = new Material(
assetManager, "Common/MatDefs/Misc/SimpleTextured.j3md");
mat_brick.setTexture("m_ColorMap",
assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg"));
wall.setMaterial(mat_brick);
wall.setLocalTranslation(2.0f,-2.5f,0.0f);
rootNode.attachChild(wall);

Если вы ознакомились с предыдущими статьями, то здесь вопросов не должно возникать. Единственное, на что стоит обратить внимание (раз уж мы рассматриваем Asset Manager), так это пути к контентным файлам (ресурсам проекта).

Смысл применения менеджера ресурсов виден не только в структуризации содержимого, а также в удобстве пользования.

Путь к ресурсу, как вы видите, указывается не в полной степени (C:\JMonkey\......), а лишь в рамках проекта.

Двигаемся далее:

guiNode.detachAllChildren();
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
BitmapText helloText = new BitmapText(guiFont, false);
helloText.setSize(guiFont.getCharSet().getRenderedSize());
helloText.setText("Hello World");
helloText.setLocalTranslation(300, helloText.getLineHeight(), 0);
guiNode.attachChild(helloText);

Этот блок кода отображает строку "Hello text" в нижней части экрана. мы прикрепляем текст к guiNode (спец узел для отображения плоских элементов). Иными словами, можно считать данную строку элементов интерфейса игры (довольно примитивным, но все же :) ).

Общий процесс инициализации строки :

1. определение шрифта отображения текста

2. определение размера текстовой строки

3. непосредственное содержимое строки

4. расположение текстовой информации на сетке координат экрана

5. присваивание hellotext элемента guiNode узлу


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

Пример с guiNode.detachAllChildren();


Пример без guiNode.detachAllChildren();


Теперь перейдем к самому интересному - импорту модели в наш проект:

JMonkey использует для моделей формат OgreXML (.mesh.xml, .scene, .material, .skeleton.xml). Для импорта любой модели в данном формате необходимо изначально разместить все ресурсы по это модели в папку с требуемым именем, а папку в свою очеред в папку Models Asset Manager'a.

Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.mesh.xml");
ninja.scale(0.05f, 0.05f, 0.05f);
ninja.rotate(0.0f, -3.0f, 0.0f);
ninja.setLocalTranslation(0.0f, -5.0f, -2.0f);
rootNode.attachChild(ninja);


Первая строка- загружаем spatial, вторая - задаем габариты от исходных (которые указаны при создании модели), третья - вращение модели вокруг оси y, четвертая - размещения модели в плоскостях z и y. И, конечно же, присваивание импортированной модели узлу rootNode для отображения в сцене.

Завершающим этапом станет добавление источника света для освещения нашей композиции:

DirectionalLight sun = new DirectionalLight();
sun.setDirection(new Vector3f(-0.1f, -0.7f, -1.0f));
rootNode.addLight(sun);

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

Изначально создается DirectionalLight sun (направленный источник света с именем sun). Затем устанавливается направление "деятельности" источника света.

Игровой проект вдоль и поперек будет состоять из контента, который Вы заготовите для него, однако представление о элементарном создании объектов в JMonkey (тот же куб) поможет на практике в тестировании отдельных аспектов движка или технологической демо-версии игры.

Теперь в Вашем (и моем :) ) арсенале имеются инструменты и, что самое главное, знания для создания статической сцены, ее рендеринга с дальнейшим добавлением объектов (будь то геометрический объект или элемент интерфейса) и их преобразованием относительно исходника, созданного в 3D редакторе.


Комментариев нет:

Отправить комментарий