Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 1: An introduction to the most basic Ogre constructs: SceneManager, SceneNode, and Entity objects.

← →
Английский оригинал Перевод на русский

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

Давайте создадим еще один объект SceneNode, но сейчас укажем ее начальное расположение.

alexx_x 07.07.11 в 12:36

0

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

alexx_x 07.07.11 в 12:36

0

Первая - мы назвали SceneNode и Entity немного по другому.

alexx_x 07.07.11 в 12:37

0

Вторая - мы указали начальное положение смещенное на 100 единиц по оси X относительно корневой SceneNode (напомню что координаты SceneNode заданы относительно их предков).

alexx_x 07.07.11 в 12:39

0

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

alexx_x 07.07.11 в 12:40

0

Можно сдвинутся немного назад используя клавишу 's', или стрелку вниз чтобы их увидеть.

alexx_x 07.07.11 в 12:41

0

РАССМОТРИМ ENTITY ПОДРОБНЕЕ

alexx_x 07.07.11 в 12:42

0

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

alexx_x 07.07.11 в 12:44

0

В классе Entity есть несколько функций которые можно использовать прямо сейчас.

alexx_x 07.07.11 в 12:44

0

Первая - Entity::setVisible и Entity::isVisible.

alexx_x 07.07.11 в 12:45

0

Мы можем скрыть или включить отображение головы на экране просто вызвав эту функцию.

alexx_x 07.07.11 в 12:46

0

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

alexx_x 07.07.11 в 12:47

0

Обратите внимание, что во все это не нужно "впутывать" Entities.

proVIDec 08.07.11 в 09:51

1

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

alexx_x 07.07.11 в 13:43

0
+1

Единственное на чем вы сэкономите в таком случае, это отсутствие затрат на создание и удаление объекта Entity, а они относительно малы.

alexx_x 07.07.11 в 13:46

0

Функция getName возвращает название объекта Entity, функция getParentSceneNode возвращает SceneNode к которой присоединен объект Entity.

alexx_x 07.07.11 в 13:47

0

РАССМОТРИМ SCENENODES ПОДРОБНЕЕ

alexx_x 07.07.11 в 13:47

0

Класс SceneNode позволяет довольно много, но мы рассмотрим наиболее используемые.

alexx_x 07.07.11 в 13:48

0

Для того чтобы получить или указать текущее расположение SceneNode есть функции getPosition и setPosition (они возвращают координаты относительно родительской SceneNode).

alexx_x 07.07.11 в 13:50

0

Метод translate позволяет передвинуть объект относительно его текущей позиции.

alexx_x 07.07.11 в 13:50

0

Кроме позиционирования SceneNode позволяет вращать и масштабировать объект.

alexx_x 07.07.11 в 13:51

0

Для масштабирования применяется функция scale.

alexx_x 07.07.11 в 13:52

0

Для вращения относительно каждой из координатных осей используются функции pitch, yaw и roll.

alexx_x 07.07.11 в 13:53

0

Чтобы вернуть дефолтовую ориентацию объекта служит функция resetOrientation.

alexx_x 07.07.11 в 13:53

0

Вы также можете использовать функции setOrientation, getOrientation и rotate для более гибкого вращения.

(анонимно) 07.07.11 в 14:43

0

Тему квантерионов (Quaternions) мы возможно поднимем в более поздних статьях.

(анонимно) 07.07.11 в 14:46

0

Вы уже имели дело с функцией attachObject.

(анонимно) 07.07.11 в 14:46

0

Эти связанные функции также будут довольно полезны, если вы ищете способ управлять объектами которые присоединены к SceneNode: numAttachedObjects, getAttachedObject (есть несколько версий этой функции), detachObject (тоже несколько версий), detachAllObjects.

(анонимно) 07.07.11 в 14:48

0

Также существует целый набор функций для работы с предком и потомками SceneNode.

alexx_x 07.07.11 в 19:02

0

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

alexx_x 07.07.11 в 19:03

0

Итак у нас получился такой код:

alexx_x 07.07.11 в 19:04

0

Если мы изменим 6 линию с этой: на эту:

alexx_x 07.07.11 в 19:04

0

Таким образом мы укажем что headNode2 является потомком headNode.

alexx_x 07.07.11 в 19:05

0

При перемещении headNode, headNode2 также будет перемещатся, но передвигая headNode2 - headNode останется на месте.

alexx_x 07.07.11 в 19:06

0

Для примера этот код будет перемещать только headNode2:

alexx_x 07.07.11 в 19:07

0

Этот код заставит перемещаться headNode, но учитывая то что headNode2 является потомком headNode, headNode2 будет перемещаться вместе с headNode.

alexx_x 07.07.11 в 19:08

0

Если у вас возникли проблемы с пониманием этого, давайте разберем простой пример. Мы начнем с корневой SceneNode и пойдем вниз по иерархии нод.

alexx_x 07.07.11 в 19:10

0

Давайте предположим (возьмем наш случай), мы начнем с headNode (0, 0, 0) и переместим ее (translate) на (25, 0, 0). Таким образом новая позиция headNode станет (25, 0, 0) относительно его предка.

alexx_x 07.07.11 в 19:12

0

Позиция headNode2 (100, 0, 0) мы перемещаем ее (translate) на (10, 0, 10). Итого новая позиция headNode2 станет (110, 0, 10) относительно его предка (headNode).

alexx_x 07.07.11 в 19:14

0

Теперь представим где будут находится эти ноды.

alexx_x 07.07.11 в 19:14

0

Начнем с корневой SceneNode. Ее позиция всегда (0, 0, 0).

alexx_x 07.07.11 в 19:15

0

Сейчас положение headNode = (root + headNode): (0, 0, 0) + (25, 0, 0) = (25, 0, 0). Не удивительно.

alexx_x 07.07.11 в 19:16

0

headNode2 является потомком headNode, таким образом ее позиция будет (root + headNode + headNode2): (0, 0, 0) + (25, 0, 0) + (110, 0, 10) = (135, 0, 10).

alexx_x 07.07.11 в 19:17

0

Это всего лишь пример того как наследуются позиции SceneNode.

alexx_x 07.07.11 в 19:17

0

Впрочем необходимость вычислять абсолютные позиции нод возникает довольно редко.

alexx_x 07.07.11 в 19:19

0

Под конец заметим, что вы можете получить как объекты SceneNode так и Entity используя методы getSceneNode и getEntity объекта SceneManager. Следовательно нет необходимости хранить на них ссылки.

alexx_x 07.07.11 в 19:20

0

Имеет смысл сохранять ссылки только на те объекты, которыми вы часто пользуетесь.

alexx_x 07.07.11 в 19:21

0

Дополнительные рекомендации

alexx_x 08.07.11 в 05:01

0

К этому моменту у вас должно сложится общее понимание Entities, SceneNodes и SceneManager.

alexx_x 07.07.11 в 19:22

0

Мы предлагаем начать с кода который мы привели выше с удалением и добавлением головы огра.

alexx_x 08.07.11 в 09:44

0

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

proVIDec 08.07.11 в 09:45

1
Минутку...

← Предыдущая страница

Следующая страница →