Данная статья будет состоять из двух частей. В первой части мы рассмотрим с Вами такие важные понятия как 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.
- SceneGraph представляет собой трехмерный мир
- Объекты SceneGraph (в данном случае кубики) называют Spatial (грубо говоря, это совокупность информации об объекте:местоположении, вращении, размере и т.д.)
- Spatial может быть загружен, трансформирован, сохранен.
- Существует два вида Spatial (Node и Geometry).
- Для добавления 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.
Комментариев нет:
Отправить комментарий