

= Граф сцены и другая терминология jME3

Перед тем как начать убедитесь что вы знакомы с <<документация/jme3_ru/терминология_в_разработке_3d_игр#,терминологией 3D игр>>.


Во вторых если вы новичок рекомендуем вам наши <<документация/jme3_ru/scene_graph_для_чайников#,&quot;Scene Graph для чайников&quot;>> презентации для введения в граф сцены.


Затем можно продолжить обучение jME3.



== Система координат


image::jme3/intermediate/coordinate-system.png[coordinate-system.png,with="235",height="210",align="right"]



jMonkeyEngine использует правостороннюю систему координат, как и OpenGL.


Система координат состоит из:


*  Все происходит из одной точки в пространстве.
**  Она находится всегда в (0,0,0).

*  Три координатные оси которые всегда перпендикулярны и сходятся в этой точке.
**  Ось Х это “право/лево
**  Ось Y это “верх/низ
**  Ось Z это “на себя/от себя


Каждая точка в 3D пространстве определяется единственным образом координатами(X, Y, Z). Три числовые координаты выражаются, тем как много «шагов» от каждой из трех осей удалена точка. Тип данных для всех векторов в jME3 это com.jme3.math.Vector3f. Все векторы по отношению к описанной системе координат. +
Пример: Точка `new Vector3f(3,-5,1)` 3 шага направо, 5 шагов вниз, и 1 по отношению к вам.


Относительно вашего положения расположение камеры по умолчанию является (0.0f, 0.0f, 10.0f) и она смотрит в направлении описываемом единичным вектором (0.0f, 0.0f,-1.0f). Это означает что ваша точка зрения находится на положительной стороне оси Z, глядя на пересечение осей.


“*блок мира(world unit)*


Для ориентации:


*  По умолчанию камера находится `Vector3f(0.0f, 0.0f, 10.0f)`. 
*  Камера по умолчанию смотрите в направление описанного (так называется)  отрицательного единичного вектора Z `Vector3f(0.0f, 0.0f, -1.0f)`. Это означает, что точка зрения игрока находится на положительной стороне оси Z, смотрящая назад, к происходящему, вниз по оси Z.


== Как перемещаться по 3D-сцены

Когда вы играете у вас обычно возникает желание перемещаться по 3D сцене.


По умолчанию, jME3 использует следующие общие навигации входы

[cols="3", options="header"]
|===

a| Игровой ввод 
a| Движения Камеры 
a| Игрок POV 

a|Нажатие кнопки W и S
a|переместить камеру вперед и назад
a|вы идете назад и вперед

a|Нажатие кнопки A и D
a|переместить камеру влево и вправо
a|вы шаг влево или вправо

a|Нажатие кнопки Q и Y
a|перемещать камеру вверх и вниз
a|вы летите вверх и вниз

a|Переместите мышь влево-вправо
a|поворот камеры влево/вправо
a|вы посмотрите влево или вправо

a|Перемещение мыши вперед-назад
a|повернуть вверх/вниз
a|вы посмотрите на небо или ноги

|===

Эти параметры по умолчанию называются “WASD keys и “Mouse Look. Вы можете настроить <<jme3/advanced/input_handling#,input handling>> для вашей игры. Извините, но эти настройки работают лучше на QWERTY/QWERTZ клавиатуре.



== Граф сцены и RootNode(Корневой узел)

Граф сцены представляет ваш 3D мир. Объекты графа сцены jME3 вызываются через <<jme3/advanced/spatial#,Spatial>>s. Все что привязывается к родительскому _rootNode_ появляется в вашем графе сцены. Все, что прикрепляется к родителю _rootNode_ является частью сцены. Ваша игра наследует “rootNode объект из `SimpleApplication` класса.



image::jme3/intermediate/scene-graph.png[scene-graph.png,with="",height="",align="center"]



*  _Attaching_  Spatial к rootNode (или его узлам потомкам) добавляет его в сцену; 
*  _Detaching_  Spatial от rootNode (или его узлы потомки) удаляется со сцены.

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






== Spatials: Узел(Node) vs Геометрия

Spatial могут быть преобразованны, (другими словами, они обладают местоположением, вращения и масштаба). Spatial может быть сохранены и загружены как .3jo файлы. Есть два типа Spatials, _Nodes_ и _Geometries_.

[cols="3", options="header"]
|===

<a|  
2+a| Spatial 

a| Цель: 
2+a| Spatial это обстрактная структура данных которая хранит преобразования (перемещение, поворот, масштаб). 

<a|  
a| Geometry 
a| Node 

a| Видимость: 
a| Видимый 3D объект. 
a| Невидимые “рычажки для группы объектов. 

a| Цель: 
a| Геометрия позволяет видеть объект: форма, цвет, текстура, прозрачность. 
a| Группа узлов геометрий и других узлов вместе: Изменяете один узел и влияете на остальные привязанные к нему(отношение родитель-потомок). 

a| Содержание: 
a| Преобразование, сетка, материал. 
a| Только преобразования. Нет ни сетки ни материала. 

a| Пример: 
a| Коробка, сфера, игрок, здания, кусок местности, транспортное средство, ракеты, НПС и др… 
a| Корневой узел(rootNode), +++<abbr title="Graphical User Interface">GUI</abbr>+++ узел(guiNode), аудио узел(audioNode) а также группы узлов для автомобиля и его пасажиров и др… 

|===


== Как использовать полученные знания?

Прежде чем приступить к созданию вашей игры вы должны распланировать граф сцены: какие Узлы и Геометрии вам будут нужны? Прочтите всю <<документация/jme3_ru/начальная/documentation#,серию уроков Hello World>> чтобы узнать как загружать и создавать Spatials, как закрепить их на сцене, как преобразовывать Spatials, как добавить взаимодействие и эффекты к игре.


<<документация/jme3_ru#,Для средних и продвинутых пользователей.>> Это даст подробную информацию о том, как собрать все части воедино, чтобы создать удивительный 3D мир на Java!



== См.также

*  <<документация/jme3_ru/расширенная/spatial_ru#,Spatial>> – Подробнее о работе с узлами и геометрией.
*  <<jme3/advanced/traverse_scenegraph#,Traverse SceneGraph>> – Поиск любого узла и геометрии на сцене.
*  <<jme3/advanced/camera#,Camera>> – Узнайте больше о камере в сцене.
<tags><tag target="spatial" /><tag target="node" /><tag target="mesh" /><tag target="geometry" /><tag target="scenegraph" /><tag target="rootnode" /></tags>
