Ogre3D Intermediate Tutorials / Промежуточные туториалы Ogre3D: Intermediate Tutorial 1: Animation, Walking Between Points, and Basic Quaternions

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

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

ВВЕДЕНИЕ

proVIDec 15.07.11 в 18:34

2

В этой обучающей программе мы будем рассматривать, как взять сущность, анимировать её, и заставить её идти между предписанными пунктами.

ghostintheshell 16.07.11 в 21:46

0

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

Mingun 18.09.11 в 12:03

2

Это также охватит основы вращения Кватерниона, показывая, как заставить сущность повернуться в направлении её движения.

ghostintheshell 16.07.11 в 21:52

0

Также мы рассмотрим основы вращения через кватернионы и посмотрим, как заставить сущность смотреть в направлении её движения.

Mingun 18.09.11 в 12:06

2

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

ghostintheshell 16.07.11 в 21:54

0

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

Mingun 18.09.11 в 12:08

1

По ходу урока вы должны постепенно добавлять код в ваш проект и наблюдать результаты его компиляции.

carfine 19.04.13 в 19:40

0

ПРЕДПОСЫЛКИ

ghostintheshell 16.07.11 в 21:54

0

Предварительные условия

Mingun 18.09.11 в 13:03

1

Прежде чем начать

carfine 19.04.13 в 19:54

0

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

ghostintheshell 16.07.11 в 21:56

0

Этот урок предполагает, что вы уже знаете, как настроить проект, использующий Ogre и заставить его успешно компилироваться.

Mingun 18.09.11 в 12:43

1

К этому уроку вы должны знать, как настроить и успешно скомпилировать проект включающий в себя OGRE3D

carfine 19.04.13 в 20:09

0

Эта обучающая программа также использует STL дек структуру данных.

ghostintheshell 16.07.11 в 21:57

0

Этот урок также использует такую структуру данных из STL, как двустороннюю очередь std::deque.

Mingun 18.09.11 в 12:45

1

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

ghostintheshell 16.07.11 в 21:59

0

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

Mingun 18.09.11 в 12:46

1

Если бы Вы не знакомы с STL, я рекомендовал бы поднять Карманный справочник STL [ISBN 0-596-00556-3].

ghostintheshell 16.07.11 в 22:01

0

Если вы не знакомы с STL, я бы порекомендовал вам почитать STL Pocket Reference [ISBN 0-596-00556-3] (в русском переводе известна как "STL. Карманный справочник" [ISBN 5-469-00389-2] - прим. пер.).

Mingun 18.09.11 в 12:54

1

Это сохранит вам много времени в будущем.

ghostintheshell 16.07.11 в 22:02

0

В будущем это сохранит вам много времени.

Mingun 18.09.11 в 13:01

1

Вы можете прочитать первую часть "карманного справочника STL" здесь.

ghostintheshell 16.07.11 в 22:03

0

Вы можете прочитать первую часть "STL Pocket Reference" здесь (на английском языке - прим. пер.).

Mingun 18.09.11 в 13:02

1

ДЛЯ НАЧАЛА

proVIDec 15.07.11 в 18:34

0

С чего начать

Mingun 18.09.11 в 13:04

1

Во-первых, Вы должны создать новый проект (я назвал его ITutorial01), и добавить следующий код:

ghostintheshell 16.07.11 в 22:03

1

Убедитесь, что Вы можете компилировать этот код перед продолжением.

ghostintheshell 16.07.11 в 22:04

1

Перед продолжением убедитесь, что этот код компилируется.

Mingun 18.09.11 в 13:04

3

УСТАНОВКА СЦЕНЫ

ghostintheshell 16.07.11 в 22:04

0

Настройка сцены

Mingun 18.09.11 в 13:03

3

Прежде, чем мы начнем, заметьте, что мы уже определили 3 переменные в заголовочном файле.

ghostintheshell 16.07.11 в 22:05

1

Прежде, чем мы начнём, обратите внимание на то, что в заголовочном файле мы уже определили три переменные.

Mingun 18.09.11 в 13:06

2

mEntity будет хранить сущность, которую мы создаем, mNode будет хранить node, который мы создаем, и mWalkList будет содержать все пункты, которые мы хотим для объекта

ghostintheshell 16.07.11 в 22:10

0

Переменная mEntity будет хранить нашу сущность, переменная mNode будет хранить узел сцены, а переменная mWalkList будет содержать все точки, через которые должен пройти наш объект.

Mingun 18.09.11 в 13:09

1

перейдите в ITutorial01::createScene функцию и добавте следующий код к ней.

ghostintheshell 16.07.11 в 22:12

0

Перейдите в функцию ITutorial01::createScene() и добавьте в неё следующий код.

Mingun 18.09.11 в 13:09

1

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

ghostintheshell 16.07.11 в 22:14

0

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

Mingun 18.09.11 в 13:14

0

Затем мы создадим Робота на экране так, чтобы мы могли поиграть с ним.

ghostintheshell 16.07.11 в 22:15

0

Затем создадим робота, чтобы нам было с кем играть.

Mingun 18.09.11 в 13:15

1

Чтобы сделать это, мы создадим сущность для Робота, затем создадим SceneNode для него.

ghostintheshell 16.07.11 в 22:18

0

Для этого мы создадим сущность, а затем объект SceneNode, к которому её и прицепим.

Mingun 18.09.11 в 13:17

0

Это все будет очень основным, так что, я не буду вникать в детали.

ghostintheshell 16.07.11 в 22:20

0

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

Mingun 18.09.11 в 13:17

0

В следующей части кода мы собираемся сказать роботу, куда он должен переместиться.

ghostintheshell 16.07.11 в 22:22

1

Для таковых из Вас, кто ничего не знает о STL, объект дек - эффективная реализация двойной законченной очереди.

ghostintheshell 16.07.11 в 22:24

0

Для тех из вас, кто ничего не знает об STL, объект deque - это эффективная реализация двусторонней очереди.

Mingun 18.09.11 в 13:20

0

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

ghostintheshell 16.07.11 в 22:25

0

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

Mingun 18.09.11 в 13:21

0

push_front и push_back методы помещают пункты в переднюю и заднюю часть двусторонней очереди соответственно.

ghostintheshell 16.07.11 в 22:31

0

Методы push_front() и push_back() помещают элементы в начало и конец очереди соответственно.

Mingun 18.09.11 в 13:23

0

Методы передней и задней части возвращают значения в передней и задней части двусторонней очереди соответственно.

ghostintheshell 16.07.11 в 22:32

-3

Методы front() и back() возвращают значения, соответственно, с начала и с конца очереди.

Mingun 18.09.11 в 13:23

0
+1

pop_front и pop_back методы удаляют пункты из передней и задней части очереди соответственно.

ghostintheshell 16.07.11 в 22:34

0

Методы pop_front() и pop_back() удаляют элементы из начала и из конца очереди.

Mingun 18.09.11 в 13:25

0

Наконец, пустой метод возвращает, пуста или нет двусторонняя очередь.

ghostintheshell 16.07.11 в 22:34

-2

Наконец, метод empty() сообщает, пуста ли очередь или нет.

Mingun 18.09.11 в 13:26

0
+1

Этот код добавляет два Вектора к деку, в который мы позже заставим робот двинуться.

ghostintheshell 16.07.11 в 22:37

0

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

Mingun 18.09.11 в 13:28

0

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

ghostintheshell 16.07.11 в 22:38

0

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

Mingun 18.09.11 в 13:31

0

Это позволит нам видеть, что робот перемещается относительно других объектов на экране.

ghostintheshell 16.07.11 в 22:39

0

Это позволит нам видеть перемещения робота относительно других объектов на экране.

Mingun 18.09.11 в 13:33

0

Известите отрицательный компонент Y к их положению.

ghostintheshell 16.07.11 в 22:41

-2

Обратите внимание на отрицательную компоненту Y в их позиции.

Mingun 18.09.11 в 13:35

0

Это помещает объекты под тем, куда робот двигается, и он будет стоять сверху их, когда он дойдёт до нужного места.

ghostintheshell 16.07.11 в 22:44

0

Это сделано для того, чтобы поместить объекты под тем местом, в которое должен двигаться робот и поэтому он будет стоять сверху них, когда дойдёт до него.

Mingun 18.09.11 в 13:36

0

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

ghostintheshell 16.07.11 в 22:46

0

Наконец, мы помещаем камеру в точку, из которой хорошо видно всё происходящее. Мы просто передвигаем камеру в эту наилучшую позицию.

Mingun 18.09.11 в 13:40

0

Теперь компилируйте и запустите код.

ghostintheshell 16.07.11 в 22:47

0

Теперь скомпилируйте и запустите код.

Mingun 18.09.11 в 13:41

0
+1

АНИМАЦИЯ

ghostintheshell 16.07.11 в 22:47

1

Мы сейчас переходим в установку основной анимации.

ghostintheshell 16.07.11 в 22:49

0

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

Mingun 18.09.11 в 13:48

0

Анимация в Ogre очень проста. Чтобы сделать это, Вы должны получить AnimationState от объекта сущности, установить его опции, и активировать.

ghostintheshell 16.07.11 в 22:51

0

Анимация в Ogre очень проста. Для её настройки вы должны получить объект AnimationState от объекта Entity, установить его параметры и активировать.

Mingun 18.09.11 в 13:50

0

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

ghostintheshell 16.07.11 в 22:53

0

Это сделает анимацию активной, но вы также должны будете добавлять время к ней каждый кадр, чтобы она работала.

Mingun 18.09.11 в 13:52

0

Мы сделаем этот шаг за один раз. Во-первых, перейдите в ITutorial01::createFrameListener и добавьте следующий код после вызова в BaseApplication::createFrameListener:

ghostintheshell 16.07.11 в 22:55

0

Мы всё сделаем за один раз. Сначала перейдите в метод ITutorial01::createFrameListener() и добавьте следующий код после вызова BaseApplication::createFrameListener():

Mingun 18.09.11 в 13:54

0

Вторая строка получает AnimationState из сущности.

ghostintheshell 16.07.11 в 22:57

0

Во второй строке мы получаем объект AnimationState из сущности.

Mingun 18.09.11 в 13:55

0

В третьей строке мы вызываем setLoop( true ), который делает цикл анимации снова и снова.

ghostintheshell 16.07.11 в 22:59

0

В третьей строке мы вызываем метод setLoop(true), который зацикливает анимацию.

Mingun 18.09.11 в 13:56

0

Для некоторых анимаций (как анимация смерти), мы хотели бы установить это в ложным вместо этого.

ghostintheshell 16.07.11 в 23:02

0

Для некоторых анимаций (например, анимации смерти) мы должны бы были установить этот параметр в false.

Mingun 18.09.11 в 13:57

0

Четвертая строка фактически включает Мультипликацию. Но ждите..., где мы получили ‘idle’?

ghostintheshell 16.07.11 в 23:04

0

Четвёртая строка фактически включает анимацию. Но подождите... откуда мы взяли 'Idle'?

Mingun 18.09.11 в 13:59

0

Как эта магическая константа ошиблась там? У каждого цикла есть их собственный набор анимаций, определенных для них.

ghostintheshell 16.07.11 в 23:12

0

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

Mingun 18.09.11 в 14:01

0
+2

Чтобы видеть все анимации для особого mesh, Вы должны загрузить OgreMeshViewer и рассмотреть цикл оттуда.

ghostintheshell 16.07.11 в 23:17

0

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

Mingun 18.09.11 в 14:02

0

Теперь, если мы компилируем и запускаем демонстрационный пример, мы видим..., что ничего не изменилось.

ghostintheshell 16.07.11 в 23:18

0

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

Mingun 18.09.11 в 14:03

0

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

ghostintheshell 16.07.11 в 23:21

0

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

Mingun 18.09.11 в 14:04

0

Найдите метод ITutorial01::frameRenderingQueued, и добавьте эту строку кода в начале функции:

ghostintheshell 16.07.11 в 23:23

0

Найдите метод ITutorial01::frameRenderingQueued() и добавьте эту строку кода в начало функции:

Mingun 18.09.11 в 14:04

0
Минутку...

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