Ogre3D Intermediate Tutorials / Промежуточные туториалы Ogre3D: Intermediate Tutorial 1: Animation, Walking Between Points, and Basic Quaternions
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
ВВЕДЕНИЕ proVIDec 15.07.11 в 18:34 |
|
|
В этой обучающей программе мы будем рассматривать, как взять сущность, анимировать её, и заставить её идти между предписанными пунктами. ghostintheshell 16.07.11 в 21:46 В этом уроке мы рассмотрим, как получить объект Entity (сущность), анимировать его и заставить двигаться между предопределёнными точками. Mingun 18.09.11 в 12:03 |
||
|
Это также охватит основы вращения Кватерниона, показывая, как заставить сущность повернуться в направлении её движения. ghostintheshell 16.07.11 в 21:52 Также мы рассмотрим основы вращения через кватернионы и посмотрим, как заставить сущность смотреть в направлении её движения. Mingun 18.09.11 в 12:06 |
||
|
Поскольку Вы проходите демонстрационный пример, Вы должны медленно добавлять код к своему проекту и наблюдать результаты, как мы строим. ghostintheshell 16.07.11 в 21:54 Поскольку вы проходите урок, вы должны постепенно добавлять код к вашему проекту и наблюдать результаты после его построения. Mingun 18.09.11 в 12:08 По ходу урока вы должны постепенно добавлять код в ваш проект и наблюдать результаты его компиляции. carfine 19.04.13 в 19:40 |
||
|
ПРЕДПОСЫЛКИ ghostintheshell 16.07.11 в 21:54 Предварительные условия Mingun 18.09.11 в 13:03 Прежде чем начать carfine 19.04.13 в 19:54 |
||
|
Эта обучающая программа предпологает, что Вы уже знаете, как настроить Ogre проект и компилировать его успешно. ghostintheshell 16.07.11 в 21:56 Этот урок предполагает, что вы уже знаете, как настроить проект, использующий Ogre и заставить его успешно компилироваться. Mingun 18.09.11 в 12:43 К этому уроку вы должны знать, как настроить и успешно скомпилировать проект включающий в себя OGRE3D carfine 19.04.13 в 20:09 |
||
|
Эта обучающая программа также использует STL дек структуру данных. ghostintheshell 16.07.11 в 21:57 Этот урок также использует такую структуру данных из STL, как двустороннюю очередь std::deque. Mingun 18.09.11 в 12:45 |
||
|
В то время как никакие предварительные знания того, как использовать дек, не требуются, Вы должны, по крайней мере, знать шаблоны. ghostintheshell 16.07.11 в 21:59 Хотя вам и не требуется никаких предварительных знаний о том, как использовать двустороннюю очередь, вы, по крайней мере, должны знать, что такое шаблоны. Mingun 18.09.11 в 12:46 |
||
|
Если бы Вы не знакомы с STL, я рекомендовал бы поднять Карманный справочник STL [ISBN 0-596-00556-3]. ghostintheshell 16.07.11 в 22:01 Если вы не знакомы с STL, я бы порекомендовал вам почитать STL Pocket Reference [ISBN 0-596-00556-3] (в русском переводе известна как "STL. Карманный справочник" [ISBN 5-469-00389-2] - прим. пер.). Mingun 18.09.11 в 12:54 |
||
|
Это сохранит вам много времени в будущем. ghostintheshell 16.07.11 в 22:02 В будущем это сохранит вам много времени. Mingun 18.09.11 в 13:01 |
||
|
Вы можете прочитать первую часть "карманного справочника STL" здесь. ghostintheshell 16.07.11 в 22:03 Вы можете прочитать первую часть "STL Pocket Reference" здесь (на английском языке - прим. пер.). Mingun 18.09.11 в 13:02 |
||
|
ДЛЯ НАЧАЛА proVIDec 15.07.11 в 18:34 С чего начать Mingun 18.09.11 в 13:04 |
||
|
Во-первых, Вы должны создать новый проект (я назвал его ITutorial01), и добавить следующий код: ghostintheshell 16.07.11 в 22:03 |
||
|
Убедитесь, что Вы можете компилировать этот код перед продолжением. ghostintheshell 16.07.11 в 22:04 Перед продолжением убедитесь, что этот код компилируется. Mingun 18.09.11 в 13:04 |
||
|
УСТАНОВКА СЦЕНЫ ghostintheshell 16.07.11 в 22:04 Настройка сцены Mingun 18.09.11 в 13:03 |
||
|
Прежде, чем мы начнем, заметьте, что мы уже определили 3 переменные в заголовочном файле. ghostintheshell 16.07.11 в 22:05 Прежде, чем мы начнём, обратите внимание на то, что в заголовочном файле мы уже определили три переменные. Mingun 18.09.11 в 13:06 |
||
|
mEntity будет хранить сущность, которую мы создаем, mNode будет хранить node, который мы создаем, и mWalkList будет содержать все пункты, которые мы хотим для объекта ghostintheshell 16.07.11 в 22:10 Переменная mEntity будет хранить нашу сущность, переменная mNode будет хранить узел сцены, а переменная mWalkList будет содержать все точки, через которые должен пройти наш объект. Mingun 18.09.11 в 13:09 |
||
|
перейдите в ITutorial01::createScene функцию и добавте следующий код к ней. ghostintheshell 16.07.11 в 22:12 Перейдите в функцию ITutorial01::createScene() и добавьте в неё следующий код. Mingun 18.09.11 в 13:09 |
||
|
Сначала мы собираемся установить окружающий свет полным так, чтобы мы могли видеть объекты, каторые мы поместили на экран. ghostintheshell 16.07.11 в 22:14 Сначала мы установим окружающее освещение на полную мощность для того, чтобы мы могли видеть видеть размещаемые объекты. Mingun 18.09.11 в 13:14 |
||
|
Затем мы создадим Робота на экране так, чтобы мы могли поиграть с ним. ghostintheshell 16.07.11 в 22:15 Затем создадим робота, чтобы нам было с кем играть. Mingun 18.09.11 в 13:15 |
||
|
Чтобы сделать это, мы создадим сущность для Робота, затем создадим SceneNode для него. ghostintheshell 16.07.11 в 22:18 Для этого мы создадим сущность, а затем объект SceneNode, к которому её и прицепим. Mingun 18.09.11 в 13:17 |
||
|
Это все будет очень основным, так что, я не буду вникать в детали. ghostintheshell 16.07.11 в 22:20 Это всё базовые вещи, так что я не буду вдаваться в подробности. Mingun 18.09.11 в 13:17 |
||
|
В следующей части кода мы собираемся сказать роботу, куда он должен переместиться. ghostintheshell 16.07.11 в 22:22 |
||
|
Для таковых из Вас, кто ничего не знает о STL, объект дек - эффективная реализация двойной законченной очереди. ghostintheshell 16.07.11 в 22:24 Для тех из вас, кто ничего не знает об STL, объект deque - это эффективная реализация двусторонней очереди. Mingun 18.09.11 в 13:20 |
||
|
Мы будем использовать только несколько из его методов. ghostintheshell 16.07.11 в 22:25 Мы будем использовать только некоторые из его методов. Mingun 18.09.11 в 13:21 |
||
|
push_front и push_back методы помещают пункты в переднюю и заднюю часть двусторонней очереди соответственно. ghostintheshell 16.07.11 в 22:31 Методы push_front() и push_back() помещают элементы в начало и конец очереди соответственно. Mingun 18.09.11 в 13:23 |
||
|
Методы передней и задней части возвращают значения в передней и задней части двусторонней очереди соответственно. ghostintheshell 16.07.11 в 22:32 Методы front() и back() возвращают значения, соответственно, с начала и с конца очереди. Mingun 18.09.11 в 13:23 |
+1 | |
|
pop_front и pop_back методы удаляют пункты из передней и задней части очереди соответственно. ghostintheshell 16.07.11 в 22:34 Методы pop_front() и pop_back() удаляют элементы из начала и из конца очереди. Mingun 18.09.11 в 13:25 |
||
|
Наконец, пустой метод возвращает, пуста или нет двусторонняя очередь. ghostintheshell 16.07.11 в 22:34 Наконец, метод empty() сообщает, пуста ли очередь или нет. Mingun 18.09.11 в 13:26 |
+1 | |
|
Этот код добавляет два Вектора к деку, в который мы позже заставим робот двинуться. ghostintheshell 16.07.11 в 22:37 Этот код добавляет два вектора позиций в очередь, к которым позже будет двигаться наш робот. Mingun 18.09.11 в 13:28 |
||
|
Затем, мы хотим поместить некоторые объекты в сцену, чтобы показать, где робот, как предполагается, двигается. ghostintheshell 16.07.11 в 22:38 Далее мы размещаем в сцене некоторые объекты, которые будут показывать, куда должен будет двигаться наш робот. Mingun 18.09.11 в 13:31 |
||
|
Это позволит нам видеть, что робот перемещается относительно других объектов на экране. ghostintheshell 16.07.11 в 22:39 Это позволит нам видеть перемещения робота относительно других объектов на экране. Mingun 18.09.11 в 13:33 |
||
|
Известите отрицательный компонент Y к их положению. ghostintheshell 16.07.11 в 22:41 Обратите внимание на отрицательную компоненту Y в их позиции. Mingun 18.09.11 в 13:35 |
||
|
Это помещает объекты под тем, куда робот двигается, и он будет стоять сверху их, когда он дойдёт до нужного места. ghostintheshell 16.07.11 в 22:44 Это сделано для того, чтобы поместить объекты под тем местом, в которое должен двигаться робот и поэтому он будет стоять сверху них, когда дойдёт до него. Mingun 18.09.11 в 13:36 |
||
|
Наконец, мы хотим разместить камеру в хороший пункт рассмотрения. Мы переместим камеру, чтобы получить лучшее положение. ghostintheshell 16.07.11 в 22:46 Наконец, мы помещаем камеру в точку, из которой хорошо видно всё происходящее. Мы просто передвигаем камеру в эту наилучшую позицию. Mingun 18.09.11 в 13:40 |
||
|
Теперь компилируйте и запустите код. ghostintheshell 16.07.11 в 22:47 Теперь скомпилируйте и запустите код. Mingun 18.09.11 в 13:41 |
+1 | |
|
АНИМАЦИЯ ghostintheshell 16.07.11 в 22:47 |
||
|
Мы сейчас переходим в установку основной анимации. ghostintheshell 16.07.11 в 22:49 Сейчас мы переходим к установке базовой анимации. Mingun 18.09.11 в 13:48 |
||
|
Анимация в Ogre очень проста. Чтобы сделать это, Вы должны получить AnimationState от объекта сущности, установить его опции, и активировать. ghostintheshell 16.07.11 в 22:51 Анимация в Ogre очень проста. Для её настройки вы должны получить объект AnimationState от объекта Entity, установить его параметры и активировать. Mingun 18.09.11 в 13:50 |
||
|
Это сделает анимацию активной, но Вы должны будете также добавить время к ней после каждого фрейма для анимации, чтобы запустить. ghostintheshell 16.07.11 в 22:53 Это сделает анимацию активной, но вы также должны будете добавлять время к ней каждый кадр, чтобы она работала. Mingun 18.09.11 в 13:52 |
||
|
Мы сделаем этот шаг за один раз. Во-первых, перейдите в ITutorial01::createFrameListener и добавьте следующий код после вызова в BaseApplication::createFrameListener: ghostintheshell 16.07.11 в 22:55 Мы всё сделаем за один раз. Сначала перейдите в метод ITutorial01::createFrameListener() и добавьте следующий код после вызова BaseApplication::createFrameListener(): Mingun 18.09.11 в 13:54 |
||
|
Вторая строка получает AnimationState из сущности. ghostintheshell 16.07.11 в 22:57 Во второй строке мы получаем объект AnimationState из сущности. Mingun 18.09.11 в 13:55 |
||
|
В третьей строке мы вызываем setLoop( true ), который делает цикл анимации снова и снова. ghostintheshell 16.07.11 в 22:59 В третьей строке мы вызываем метод setLoop(true), который зацикливает анимацию. Mingun 18.09.11 в 13:56 |
||
|
Для некоторых анимаций (как анимация смерти), мы хотели бы установить это в ложным вместо этого. ghostintheshell 16.07.11 в 23:02 Для некоторых анимаций (например, анимации смерти) мы должны бы были установить этот параметр в false. Mingun 18.09.11 в 13:57 |
||
|
Четвертая строка фактически включает Мультипликацию. Но ждите..., где мы получили ‘idle’? ghostintheshell 16.07.11 в 23:04 Четвёртая строка фактически включает анимацию. Но подождите... откуда мы взяли 'Idle'? Mingun 18.09.11 в 13:59 |
||
|
Как эта магическая константа ошиблась там? У каждого цикла есть их собственный набор анимаций, определенных для них. ghostintheshell 16.07.11 в 23:12 Как туда проскользнула эта магическая константа? Каждая сетка имеет свой собственный набор анимаций, определённых специально для неё. Mingun 18.09.11 в 14:01 |
+2 | |
|
Чтобы видеть все анимации для особого mesh, Вы должны загрузить OgreMeshViewer и рассмотреть цикл оттуда. ghostintheshell 16.07.11 в 23:17 Чтобы увидеть все анимации конкретной сетки, с которой вы работаете, вы должны скачать OgreMeshViewer и посмотреть сетку через него. Mingun 18.09.11 в 14:02 |
||
|
Теперь, если мы компилируем и запускаем демонстрационный пример, мы видим..., что ничего не изменилось. ghostintheshell 16.07.11 в 23:18 Теперь, если мы скомпилируем и запустим приложение, мы увидим... что ничего не изменилось. Mingun 18.09.11 в 14:03 |
||
|
Это, потому что мы должны обновить режим анимации со временем каждого фрейма. ghostintheshell 16.07.11 в 23:21 Это потому, что мы должны обновлять состояние анимации временем каждого кадра. Mingun 18.09.11 в 14:04 |
||
|
Найдите метод ITutorial01::frameRenderingQueued, и добавьте эту строку кода в начале функции: ghostintheshell 16.07.11 в 23:23 Найдите метод ITutorial01::frameRenderingQueued() и добавьте эту строку кода в начало функции: Mingun 18.09.11 в 14:04 |
