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 |
|
|
Это должно быть уже знакомо. Мы сделали то же самое что и в прошлый раз, кроме двух вещей. alexx_x 07.07.11 в 12:36 |
||
|
Первая - мы назвали SceneNode и Entity немного по другому. alexx_x 07.07.11 в 12:37 |
||
|
Вторая - мы указали начальное положение смещенное на 100 единиц по оси X относительно корневой SceneNode (напомню что координаты SceneNode заданы относительно их предков). alexx_x 07.07.11 в 12:39 |
||
|
Скомпилируйте и запустите программу. Сейчас на сцене две головы огра расположенные бок о бок. alexx_x 07.07.11 в 12:40 |
||
|
Можно сдвинутся немного назад используя клавишу 's', или стрелку вниз чтобы их увидеть. alexx_x 07.07.11 в 12:41 |
||
|
РАССМОТРИМ ENTITY ПОДРОБНЕЕ alexx_x 07.07.11 в 12:42 |
||
|
Класс Entity довольно обширный, и мы не сможем затронуть все аспекты в рамках статьи, но расскажем достаточно для начала. alexx_x 07.07.11 в 12:44 |
||
|
В классе Entity есть несколько функций которые можно использовать прямо сейчас. alexx_x 07.07.11 в 12:44 |
||
|
Первая - Entity::setVisible и Entity::isVisible. alexx_x 07.07.11 в 12:45 |
||
|
Мы можем скрыть или включить отображение головы на экране просто вызвав эту функцию. alexx_x 07.07.11 в 12:46 |
||
|
Если необходимо скрыть голову, но позже отобразить ее, тогда имеет смысл воспользоваться этой функцией, вместо того чтобы удалять и создавать ее заново. alexx_x 07.07.11 в 12:47 |
||
|
Обратите внимание, что во все это не нужно "впутывать" Entities. proVIDec 08.07.11 в 09:51 |
||
|
В память загружается только одна копия любого объекта или текстуры, поэтому уменьшая количество Entity вы не сэкономите много памяти. alexx_x 07.07.11 в 13:43 |
+1 | |
|
Единственное на чем вы сэкономите в таком случае, это отсутствие затрат на создание и удаление объекта Entity, а они относительно малы. alexx_x 07.07.11 в 13:46 |
||
|
Функция getName возвращает название объекта Entity, функция getParentSceneNode возвращает SceneNode к которой присоединен объект Entity. alexx_x 07.07.11 в 13:47 |
||
|
РАССМОТРИМ SCENENODES ПОДРОБНЕЕ alexx_x 07.07.11 в 13:47 |
||
|
Класс SceneNode позволяет довольно много, но мы рассмотрим наиболее используемые. alexx_x 07.07.11 в 13:48 |
||
|
Для того чтобы получить или указать текущее расположение SceneNode есть функции getPosition и setPosition (они возвращают координаты относительно родительской SceneNode). alexx_x 07.07.11 в 13:50 |
||
|
Метод translate позволяет передвинуть объект относительно его текущей позиции. alexx_x 07.07.11 в 13:50 |
||
|
Кроме позиционирования SceneNode позволяет вращать и масштабировать объект. alexx_x 07.07.11 в 13:51 |
||
|
Для масштабирования применяется функция scale. alexx_x 07.07.11 в 13:52 |
||
|
Для вращения относительно каждой из координатных осей используются функции pitch, yaw и roll. alexx_x 07.07.11 в 13:53 |
||
|
Чтобы вернуть дефолтовую ориентацию объекта служит функция resetOrientation. alexx_x 07.07.11 в 13:53 |
||
|
Вы также можете использовать функции setOrientation, getOrientation и rotate для более гибкого вращения. (анонимно) 07.07.11 в 14:43 |
||
|
Тему квантерионов (Quaternions) мы возможно поднимем в более поздних статьях. (анонимно) 07.07.11 в 14:46 |
||
|
Вы уже имели дело с функцией attachObject. (анонимно) 07.07.11 в 14:46 |
||
|
Эти связанные функции также будут довольно полезны, если вы ищете способ управлять объектами которые присоединены к SceneNode: numAttachedObjects, getAttachedObject (есть несколько версий этой функции), detachObject (тоже несколько версий), detachAllObjects. (анонимно) 07.07.11 в 14:48 |
||
|
Также существует целый набор функций для работы с предком и потомками SceneNode. alexx_x 07.07.11 в 19:02 |
||
|
Поскольку все позиционирование и перемещение выполнятся относительно предка SceneNode, мы можем заставить две SceneNode двигаться вместе. alexx_x 07.07.11 в 19:03 |
||
|
Итак у нас получился такой код: alexx_x 07.07.11 в 19:04 |
||
|
Если мы изменим 6 линию с этой: на эту: alexx_x 07.07.11 в 19:04 |
||
|
Таким образом мы укажем что headNode2 является потомком headNode. alexx_x 07.07.11 в 19:05 |
||
|
При перемещении headNode, headNode2 также будет перемещатся, но передвигая headNode2 - headNode останется на месте. alexx_x 07.07.11 в 19:06 |
||
|
Для примера этот код будет перемещать только headNode2: alexx_x 07.07.11 в 19:07 |
||
|
Этот код заставит перемещаться headNode, но учитывая то что headNode2 является потомком headNode, headNode2 будет перемещаться вместе с headNode. alexx_x 07.07.11 в 19:08 |
||
|
Если у вас возникли проблемы с пониманием этого, давайте разберем простой пример. Мы начнем с корневой SceneNode и пойдем вниз по иерархии нод. alexx_x 07.07.11 в 19:10 |
||
|
Давайте предположим (возьмем наш случай), мы начнем с headNode (0, 0, 0) и переместим ее (translate) на (25, 0, 0). Таким образом новая позиция headNode станет (25, 0, 0) относительно его предка. alexx_x 07.07.11 в 19:12 |
||
|
Позиция headNode2 (100, 0, 0) мы перемещаем ее (translate) на (10, 0, 10). Итого новая позиция headNode2 станет (110, 0, 10) относительно его предка (headNode). alexx_x 07.07.11 в 19:14 |
||
|
Теперь представим где будут находится эти ноды. alexx_x 07.07.11 в 19:14 |
||
|
Начнем с корневой SceneNode. Ее позиция всегда (0, 0, 0). alexx_x 07.07.11 в 19:15 |
||
|
Сейчас положение headNode = (root + headNode): (0, 0, 0) + (25, 0, 0) = (25, 0, 0). Не удивительно. alexx_x 07.07.11 в 19:16 |
||
|
headNode2 является потомком headNode, таким образом ее позиция будет (root + headNode + headNode2): (0, 0, 0) + (25, 0, 0) + (110, 0, 10) = (135, 0, 10). alexx_x 07.07.11 в 19:17 |
||
|
Это всего лишь пример того как наследуются позиции SceneNode. alexx_x 07.07.11 в 19:17 |
||
|
Впрочем необходимость вычислять абсолютные позиции нод возникает довольно редко. alexx_x 07.07.11 в 19:19 |
||
|
Под конец заметим, что вы можете получить как объекты SceneNode так и Entity используя методы getSceneNode и getEntity объекта SceneManager. Следовательно нет необходимости хранить на них ссылки. alexx_x 07.07.11 в 19:20 |
||
|
Имеет смысл сохранять ссылки только на те объекты, которыми вы часто пользуетесь. alexx_x 07.07.11 в 19:21 |
||
|
Дополнительные рекомендации alexx_x 08.07.11 в 05:01 |
||
|
К этому моменту у вас должно сложится общее понимание Entities, SceneNodes и SceneManager. alexx_x 07.07.11 в 19:22 |
||
|
Мы предлагаем начать с кода который мы привели выше с удалением и добавлением головы огра. alexx_x 08.07.11 в 09:44 Мы предлагаем начать с кода, расположенного выше, и добавлять и удалять головы огра со сцены. proVIDec 08.07.11 в 09:45 |
