вторник, 15 февраля 2011 г.

JMonkey: Статья 2.1 Понятия Node (узел) и Geometry (геометрическая форма)

Всем привет.

Данная статья будет состоять из двух частей. В первой части мы рассмотрим с Вами такие важные понятия как Node и Geometry применительно к JMonkey.

Вторая часть будет посвящена углубленному рассмотрению использования (в данном случае модификации) узлов (Nodes), а также отличиям абстрактных объектов (Nodes) от геометрических (Geometry).

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

Итак, начнем.

Построение трехмерной игры начинается с создания сцены и некоторых объектов. Вы расставляете объекты (препятствия, бонусы и т.д.) на сцене, а затем вращаете, анимируете, изменяете их размер и т.д.

Предполагая, что Вы ознакомились с первой статьей по JMonkey, я не буду расписывать процесс создания проекта в JMonkey IDE.

Исходный код данной статьи выглядит таким образом:


package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.math.ColorRGBA;
import com.jme3.scene.Node;


public class HelloNode extends SimpleApplication {

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

@Override
public void simpleInitApp() {

Box box1 = new Box( new Vector3f(1,-1,1), 1,1,1);
Geometry blue = new Geometry("Box", box1);
Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/SolidColor.j3md");
mat1.setColor("m_Color", ColorRGBA.Blue);
blue.setMaterial(mat1);

Box box2 = new Box( new Vector3f(1,3,1), 1,1,1);
Geometry red = new Geometry("Box", box2);
Material mat2 = new Material(assetManager, "Common/MatDefs/Misc/SolidColor.j3md");
mat2.setColor("m_Color", ColorRGBA.Red);
red.setMaterial(mat2);

Node pivot = new Node("pivot");
rootNode.attachChild(pivot);

pivot.attachChild(blue);
pivot.attachChild(red);


pivot.rotate( 0.4f , 0.4f , 0.0f );

}
}


Скомпилируйте и запустите пример. На экране должны отображаться два кубика.


Введем новые понятия согласно терминологии движка JMonkey.

  1. SceneGraph представляет собой трехмерный мир
  2. Объекты SceneGraph (в данном случае кубики) называют Spatial (грубо говоря, это совокупность информации об объекте:местоположении, вращении, размере и т.д.)
  3. Spatial может быть загружен, трансформирован, сохранен.
  4. Существует два вида Spatial (Node и Geometry).
  5. Для добавления Spatial к SceneGraph, вы прикрепляете Spatial к rootNode. Следовательно все, что прикреплено к rootNode яляется частью Scenegraph.

Теперь давайте рассмотрим данный код.

Создание первого кубика:


Box box1 = new Box( new Vector3f(1,-1,1), 1,1,1);
Geometry blue = new Geometry("Box", box1);
Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/SolidColor.j3md");
mat1.setColor("m_Color", ColorRGBA.Blue);
blue.setMaterial(mat1);


Прежде всего, не забываем о том, что все манипуляции с объектами сцены мы осуществляем, используя метод simpleInitApp() (см. Статью 1).

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

Затем, создаем геометрический объект сцены, используя Spatial первого куба. Далее создается материал, которому присваивается определенный цвет (в данном случае синий), а затем применяется к ранее созданной геометрии куба.

Алгоритм создания второго куба аналогичен первому.

Следующий шаг - создание Node (узла).

Node pivot = new Node("pivot");
rootNode.attachChild(pivot);

Здесь стоит отметить тот факт, что сам по себе узел не отображается в рендер-окне сцены, а существует как некая абстрактная форма.

Далее мы закрепляем наши кубики за созданным узлом pivot:

pivot.attachChild(blue);
pivot.attachChild(red);

При прочтении документации, у меня невольно возник вопрос: "зачем привязывать кубы к узле, если их и так можно отобразить на сцене?". Логика моментально подсказал ответ :)

Смысл привязывания кубов к узлу в данном примере состоит в том, что при таком расположении вещей у нас появляется возможность манипулировать геометрическими объектами, задавая параметры для узла, что и доказывает последняя строка кода:

pivot.rotate( 0.4f , 0.4f , 0.0f );


Надеюсь, что с созданием узлов ни у кого не возникнет проблем. Подробнее о Nodes ( будем уже переходить на терминологию JMonkey :) ) Вы узнаете во второй части статьи.

С уважением, DanielDredd.


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

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