Ogre3D Intermediate Tutorials / Промежуточные туториалы Ogre3D: Intermediate Tutorial 1: Animation, Walking Between Points, and Basic Quaternions
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Теперь постройте и запустите приложение. Вы должны видеть, что робот выполняет его бесполезную анимацию, стоя на месте. ghostintheshell 17.07.11 в 21:47 Теперь постройте и запустите приложение. Вы должны увидеть, что робот выполняет свою анимацию "ничего-не-деланья", стоя на месте. Mingun 18.09.11 в 14:06 |
+2 |
|
ПЕРЕМЕЩЕНИЕ РОБОТА ghostintheshell 17.07.11 в 21:48 |
||
|
Теперь мы собираемся выполнить сложную задачу создания прогулки робота от пункта до пункта. ghostintheshell 17.07.11 в 21:50 |
||
|
Прежде, чем мы начнем, я хотел бы описать переменные, которые мы определили. ghostintheshell 17.07.11 в 21:50 |
||
|
Мы собираемся использовать 4 переменные, чтобы выполнить задачу перемещения робота. ghostintheshell 17.07.11 в 21:51 Для реализации задачи перемещения робота мы будем использовать четыре переменные. Mingun 18.09.11 в 15:01 |
||
|
Прежде всего мы собираемся сохранить направление, в котором робот перемещается в mDirection. ghostintheshell 17.07.11 в 21:53 Прежде всего, мы должны сохранить направление, в котором перемещается робот, в переменной mDirection. Mingun 18.09.11 в 15:00 |
||
|
Мы сохраним текущее назначение передвижения Робота в mDestination. ghostintheshell 17.07.11 в 21:55 Мы сохраним текущую точку назначения робота в его путешествии в переменной mDestination. Mingun 18.09.11 в 15:03 |
||
|
Мы сохраним расстояние, которое робот имеет в запасе, чтобы пойти в mDistance. ghostintheshell 17.07.11 в 21:57 В переменной mDistance мы сохраним расстояние, которое роботу всё ещё нужно пройти до пункта назначения. Mingun 18.09.11 в 15:05 |
||
|
Наконец, мы сохраним скорость движения робота в mWalkSpeed. ghostintheshell 17.07.11 в 21:58 И, наконец, в переменной mWalkSpeed мы сохраним скорость движения робота. Mingun 18.09.11 в 15:05 |
||
|
Первая вещь, которую мы должны сделать, состоит в том, чтобы настроить эти переменные. ghostintheshell 17.07.11 в 21:58 Перво-наперво нам нужно установить начальные значения этим переменным. Mingun 18.09.11 в 15:06 |
||
|
Мы установим скорость прогулки в 35 единиц в секунду. одну важную вещь нужно отметить здесь. ghostintheshell 17.07.11 в 22:00 Мы установим скорость ходьбы в 35 единиц в секунду. Здесь нужно обратить внимание на одну очень важную вещь. Mingun 18.09.11 в 15:07 |
||
|
Мы явно устанавливаем mDirection быть НУЛЕВЫМ вектором, потому что позже мы будем использовать это, чтобы определить, перемещаем ли мы Робота или нет. ghostintheshell 17.07.11 в 22:01 Переменную mDirection мы явно устанавливаем в нулевой вектор, потому что позже мы будем использовать её для определения того, двигается ли робот или нет. Mingun 18.09.11 в 15:09 |
||
|
Добавьте следующий код к ITutorial01::createFrameListener: ghostintheshell 17.07.11 в 22:01 Добавьте следующий код к методу ITutorial01::createFrameListener(): Mingun 18.09.11 в 15:09 |
||
|
Теперь, когда это сделано, мы должны привести робота в движение. ghostintheshell 17.07.11 в 22:02 |
||
|
Чтобы заставить робота переместиться, мы просто говорим ему изменять анимации. ghostintheshell 17.07.11 в 22:02 Чтобы заставить робота двигаться, мы просто говорим ему изменять анимации. Mingun 18.09.11 в 15:12 |
||
|
Однако, мы только хотим начать перемещение робота, если есть другое местоположение для движения. ghostintheshell 17.07.11 в 22:04 Однако нам нужно начинать перемещение робота только в том случае, если есть позиция, куда он может двигаться. Mingun 18.09.11 в 15:13 |
||
|
По этой причине мы вызываем функцию ITutorial01::nextLocation. ghostintheshell 17.07.11 в 22:04 |
||
|
Добавьте этот код к верху метода ITutorial01::frameRenderingQueued как раз перед вызовом AnimationState::addTime: ghostintheshell 17.07.11 в 22:05 Добавьте этот код в самый верх метода ITutorial01::frameRenderingQueued() прямо перед вызовом метода AnimationState::addTime(): Mingun 18.09.11 в 15:14 |
||
|
Если Вы будете компилировать и запускать код прямо сейчас, то робот будет идти в назначенное место. ghostintheshell 17.07.11 в 22:06 Если вы сейчас скомпилируете и запустите код, робот будет шагать на месте. Mingun 18.09.11 в 15:15 |
||
|
Это, потому что робот отправляется в путь с направлением НОЛЯ и нашей функции ITutorial01::nextLocation всегда возвращающей верно. ghostintheshell 17.07.11 в 22:08 Это произойдёт потому, что робот начинает идти в нулевом направлении и наша функция ITutorial01::nextLocation() всегда возвращает true. Mingun 18.09.11 в 15:17 |
||
|
В более поздних шагах мы будем добавлять немного больше интеллекта к функции ITutorial01::nextLocation. ghostintheshell 17.07.11 в 22:10 В следующих шагах мы добавим немного больше интеллекта функции ITutorial01::nextLocation(). Mingun 18.09.11 в 15:17 |
||
|
Теперь мы собираемся фактически переместить робота на сцену. Чтобы сделать это, мы должны сделать, чтобы он перемещал маленькую часть каждый фрейм. ghostintheshell 17.07.11 в 22:13 Теперь нам нужно действительно переместить робота в сцене. Для этого мы должны перемещать его на небольшое расстояние каждый кадр. Mingun 21.09.11 в 12:23 |
||
|
Перейдите в метод ITutorial01::frameRenderingQueued. ghostintheshell 17.07.11 в 22:14 |
||
|
Мы будем добавлять следующий код сразу после нашего предыдущего если оператор точно выше вызова AnimationState::addTime. ghostintheshell 17.07.11 в 22:24 Мы будем добавлять следующий код между предыдущим оператором if и вызовом метода AnimationState::addTime(). Mingun 21.09.11 в 12:26 |
||
|
Этот код будет рассматривать заявку, когда робот фактически переместится; mDirection != Ogre::Vector3::ZERO. ghostintheshell 17.07.11 в 22:26 Этот код будет обрабатывать тот случай, когда робот действительно движется, т.е. когда mDirection != Ogre::Vector3::ZERO. Mingun 21.09.11 в 12:27 |
||
|
причина, почему mWalkspeed умножен evt.timeSinceLastFrame, состоит в том, что сохраниется walkspeed константа, несмотря на изменения в частоте смены кадров. ghostintheshell 17.07.11 в 22:33 Причина, по которой mWalkspeed умножается на evt.timeSinceLastFrame состоит в том, что в этом случае скорость ходьбы останется неизменной при различной частоте кадров. Mingun 21.09.11 в 12:29 |
||
|
Если бы Вы только написали Реальное move = mWalkspeed, робот шел бы медленно на медленном компьютере, и шел бы быстро на быстром. ghostintheshell 17.07.11 в 22:34 Если бы мы написали Real move = mWalkspeed, робот бы ходил медленнее на слабых машинах и быстрее на мощных. Mingun 21.09.11 в 15:26 |
||
|
Теперь, мы должны проверить и увидеть, если мы собираемся промахнуться по целевой позиции. ghostintheshell 17.07.11 в 22:36 Теперь нам нужно проверить, дошли ли мы до конечной точки. Mingun 21.09.11 в 15:27 |
+1 | |
|
Таким образом, если mDistance - теперь меньше чем ноль, мы должны резко перескочить к пункту и настроить движение к следующему пункту. ghostintheshell 19.07.11 в 20:34 Если mDistance меньше нуля, мы должны перепрыгнуть в целевую точку и продолжить движение к следующей точке. Mingun 21.09.11 в 15:29 |
||
|
Отметьте, что мы устанавливаем mDirection в НУЛЕВОЙ вектор. ghostintheshell 19.07.11 в 20:34 Обратите внимание, что мы устанавливаем mDirection в нулевой вектор. Mingun 21.09.11 в 15:29 |
||
|
Если nextLocation метод не изменяет mDirection (то есть некуда пойти), тогда, мы больше не должны переместиться. ghostintheshell 19.07.11 в 20:38 Если метод nextLocation() не изменяет mDirection (что означает, что больше некуда идти), мы не должны больше двигаться. Mingun 21.09.11 в 15:31 |
||
|
Теперь, когда мы двинулись в пункт, мы нуждаемся к установке в движении к следующему пункту. ghostintheshell 19.07.11 в 20:38 Теперь, когда мы передвинулись в эту точку, мы должны настроить движение к следующей точке. Mingun 21.09.11 в 15:32 |
||
|
Как только мы знаем, должны ли мы двинуться в другой пункт или нет, мы можем установить соответствующую анимацию; ходьба, если есть другой пункт, чтобы пойти и бездействовать, если нет больше пунктов назначения. ghostintheshell 19.07.11 в 20:41 Когда мы узнаем, надо нам двигаться в следующую точку или нет, мы можем установить подходящую анимацию - анимацию ходьбы, если есть следующая точка и анимацию бездействия, если такой точки нет. Mingun 21.09.11 в 15:35 |
||
|
Это - простой вопрос урегулирования бездействия анимации, если нет больше местоположений. ghostintheshell 19.07.11 в 20:46 Это просто вопрос установки анимации бездействия, если больше нет точек назначения. Mingun 21.09.11 в 15:38 |
+2 | |
|
Отметьте, что у нас нет никакой потребности установить анимацию ходьбы снова, если есть больше пунктов, в которые пойти, в очереди. ghostintheshell 19.07.11 в 20:53 Обратите внимание: нам не нужно устанавливать анимацию ходьбы, если есть дополнительные точки в очереди, к которым нужно пройти. Mingun 21.09.11 в 15:39 |
||
|
Так как робот уже идет нет никакой причины сказать ему делать так снова. ghostintheshell 19.07.11 в 20:54 Поскольку робот уже идёт, нет никаких оснований говорить делать ему тоже самое. Mingun 21.09.11 в 15:40 |
||
|
Однако, если робот должен пойти в другой пункт, то мы должны поворачивать его, чтобы стоять перед тем пунктом. ghostintheshell 19.07.11 в 20:55 Однако, если робот должен пойти в другой пункт, мы должны повернуть его таким образом, чтобы он смотрел в эту точку. Mingun 21.09.11 в 15:41 |
||
|
Пока мы еще оставляем комментарий placeholder в другом операторе; помните это место, поскольку мы возвратимся к нему позже. ghostintheshell 19.07.11 в 20:59 Пока мы просто оставим комментарий в предложении else оператора if; запомните это место, поскольку мы позже к нему вернёмся. Mingun 21.09.11 в 15:43 |
||
|
Это заботится о том, когда мы очень близко к целевому положению. Теперь мы должны управлять нормальным положением, когда мы находимся только на пути к положению, но мы еще не там. ghostintheshell 19.07.11 в 21:04 Вышенаписанный код обрабатывает ситуацию, когда мы находимся близко к цели. Теперь же мы должны обработать нормальный случай, когда мы находимся на пути к цели, но ещё не там. Mingun 21.09.11 в 15:45 |
||
|
Чтобы сделать это, мы переведем робота в направлении передвижения, и перемещаем его величиной, определенной переменной движения. ghostintheshell 19.07.11 в 21:08 Для этого мы переместим робота в направлении его передвижения на величину, определяемую переменной перемещения. Mingun 21.09.11 в 15:47 |
||
|
Это будет выполнено, если добавить следующий код: ghostintheshell 19.07.11 в 21:10 Это достигается путём добавления следующего кода: Mingun 21.09.11 в 15:47 |
||
|
Мы почти всё сделали. Наш код теперь делает все кроме настроенных переменных, необходимых для движения. ghostintheshell 19.07.11 в 21:14 Мы сделали почти всё. Наш код делает всё, за исключением установки переменных, необходимых для движения. Mingun 21.09.11 в 15:48 |
||
|
Если мы можем правильно установить переменные движения, наш Робот переместится как, и предполагается. ghostintheshell 19.07.11 в 21:17 Если мы правильна установим переменные передвижения, наш робот будет двигаться так, как и предполагалось. Mingun 21.09.11 в 15:49 |
||
|
Найдите функцию ITutorial01::nextLocation. Эти возвращения функции, ложные, когда заканчиваются пункты, чтобы пойти. ghostintheshell 19.07.11 в 21:19 Найдите функцию ITutorial01::nextLocation(). Эта функция возвращает false, когда мы находимся в точке назначения. Mingun 21.09.11 в 15:50 |
||
|
Это будет первой строкой нашей функции. (Отметьте, что Вы должны оставить возвращение истинным оператора у основания функции.) ghostintheshell 19.07.11 в 21:21 Это будет первая строка нашей функции. (Обратите внимание, что вы должны оставить оператор return true в конце функции.) Mingun 21.09.11 в 15:51 |
||
|
Теперь мы должны установить переменные (все еще в nextLocation методе). ghostintheshell 19.07.11 в 21:21 Теперь мы должны установить переменные (это всё ещё метод nextLocation()). Mingun 21.09.11 в 15:52 |
||
|
Сначала мы потянем вектор назначения от двусторонней очереди. ghostintheshell 19.07.11 в 21:23 Сначала мы достаём вектор назначения из очереди. Mingun 21.09.11 в 15:53 |
||
|
Мы установим вектор направления, вычитанием текущего положения SceneNode из назначения. ghostintheshell 19.07.11 в 21:26 Мы устанавливаем вектор направления путём вычитания текущей позиции SceneNode из вектора назначения. Mingun 21.09.11 в 15:54 |
||
|
У нас есть проблема все же. Помните, как мы умножили mDirection количеством движения в frameRenderingQueued? ghostintheshell 19.07.11 в 21:27 Тут у нас возникает проблема. Помните, что мы умножали mDirection на значение перемещения в методе frameRenderingQueued()? Mingun 21.09.11 в 15:55 |
||
|
Если мы делаем это, вектор направления должен быть вектором единицы (то есть, длина, равняется одному). ghostintheshell 19.07.11 в 21:31 Если мы сделаем это, мы должны быть уверены, что вектор направления является единичным вектором (что означает, что его длина равна единице). Mingun 21.09.11 в 15:57 |
