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

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

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

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

ghostintheshell 17.07.11 в 21:47

1

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

Mingun 18.09.11 в 14:06

0
+2

ПЕРЕМЕЩЕНИЕ РОБОТА

ghostintheshell 17.07.11 в 21:48

1

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

ghostintheshell 17.07.11 в 21:50

1

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

ghostintheshell 17.07.11 в 21:50

1

Мы собираемся использовать 4 переменные, чтобы выполнить задачу перемещения робота.

ghostintheshell 17.07.11 в 21:51

0

Для реализации задачи перемещения робота мы будем использовать четыре переменные.

Mingun 18.09.11 в 15:01

0

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

ghostintheshell 17.07.11 в 21:53

0

Прежде всего, мы должны сохранить направление, в котором перемещается робот, в переменной mDirection.

Mingun 18.09.11 в 15:00

0

Мы сохраним текущее назначение передвижения Робота в mDestination.

ghostintheshell 17.07.11 в 21:55

0

Мы сохраним текущую точку назначения робота в его путешествии в переменной mDestination.

Mingun 18.09.11 в 15:03

0

Мы сохраним расстояние, которое робот имеет в запасе, чтобы пойти в mDistance.

ghostintheshell 17.07.11 в 21:57

0

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

Mingun 18.09.11 в 15:05

0

Наконец, мы сохраним скорость движения робота в mWalkSpeed.

ghostintheshell 17.07.11 в 21:58

0

И, наконец, в переменной mWalkSpeed мы сохраним скорость движения робота.

Mingun 18.09.11 в 15:05

0

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

ghostintheshell 17.07.11 в 21:58

0

Перво-наперво нам нужно установить начальные значения этим переменным.

Mingun 18.09.11 в 15:06

0

Мы установим скорость прогулки в 35 единиц в секунду. одну важную вещь нужно отметить здесь.

ghostintheshell 17.07.11 в 22:00

0

Мы установим скорость ходьбы в 35 единиц в секунду. Здесь нужно обратить внимание на одну очень важную вещь.

Mingun 18.09.11 в 15:07

0

Мы явно устанавливаем mDirection быть НУЛЕВЫМ вектором, потому что позже мы будем использовать это, чтобы определить, перемещаем ли мы Робота или нет.

ghostintheshell 17.07.11 в 22:01

0

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

Mingun 18.09.11 в 15:09

0

Добавьте следующий код к ITutorial01::createFrameListener:

ghostintheshell 17.07.11 в 22:01

0

Добавьте следующий код к методу ITutorial01::createFrameListener():

Mingun 18.09.11 в 15:09

0

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

ghostintheshell 17.07.11 в 22:02

1

Чтобы заставить робота переместиться, мы просто говорим ему изменять анимации.

ghostintheshell 17.07.11 в 22:02

0

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

Mingun 18.09.11 в 15:12

0

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

ghostintheshell 17.07.11 в 22:04

0

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

Mingun 18.09.11 в 15:13

0

По этой причине мы вызываем функцию ITutorial01::nextLocation.

ghostintheshell 17.07.11 в 22:04

1

Добавьте этот код к верху метода ITutorial01::frameRenderingQueued как раз перед вызовом AnimationState::addTime:

ghostintheshell 17.07.11 в 22:05

0

Добавьте этот код в самый верх метода ITutorial01::frameRenderingQueued() прямо перед вызовом метода AnimationState::addTime():

Mingun 18.09.11 в 15:14

0

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

ghostintheshell 17.07.11 в 22:06

0

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

Mingun 18.09.11 в 15:15

0

Это, потому что робот отправляется в путь с направлением НОЛЯ и нашей функции ITutorial01::nextLocation всегда возвращающей верно.

ghostintheshell 17.07.11 в 22:08

0

Это произойдёт потому, что робот начинает идти в нулевом направлении и наша функция ITutorial01::nextLocation() всегда возвращает true.

Mingun 18.09.11 в 15:17

0

В более поздних шагах мы будем добавлять немного больше интеллекта к функции ITutorial01::nextLocation.

ghostintheshell 17.07.11 в 22:10

0

В следующих шагах мы добавим немного больше интеллекта функции ITutorial01::nextLocation().

Mingun 18.09.11 в 15:17

0

Теперь мы собираемся фактически переместить робота на сцену. Чтобы сделать это, мы должны сделать, чтобы он перемещал маленькую часть каждый фрейм.

ghostintheshell 17.07.11 в 22:13

0

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

Mingun 21.09.11 в 12:23

0

Перейдите в метод ITutorial01::frameRenderingQueued.

ghostintheshell 17.07.11 в 22:14

1

Мы будем добавлять следующий код сразу после нашего предыдущего если оператор точно выше вызова AnimationState::addTime.

ghostintheshell 17.07.11 в 22:24

0

Мы будем добавлять следующий код между предыдущим оператором if и вызовом метода AnimationState::addTime().

Mingun 21.09.11 в 12:26

1

Этот код будет рассматривать заявку, когда робот фактически переместится; mDirection != Ogre::Vector3::ZERO.

ghostintheshell 17.07.11 в 22:26

0

Этот код будет обрабатывать тот случай, когда робот действительно движется, т.е. когда mDirection != Ogre::Vector3::ZERO.

Mingun 21.09.11 в 12:27

1

причина, почему mWalkspeed умножен evt.timeSinceLastFrame, состоит в том, что сохраниется walkspeed константа, несмотря на изменения в частоте смены кадров.

ghostintheshell 17.07.11 в 22:33

0

Причина, по которой mWalkspeed умножается на evt.timeSinceLastFrame состоит в том, что в этом случае скорость ходьбы останется неизменной при различной частоте кадров.

Mingun 21.09.11 в 12:29

1

Если бы Вы только написали Реальное move = mWalkspeed, робот шел бы медленно на медленном компьютере, и шел бы быстро на быстром.

ghostintheshell 17.07.11 в 22:34

0

Если бы мы написали Real move = mWalkspeed, робот бы ходил медленнее на слабых машинах и быстрее на мощных.

Mingun 21.09.11 в 15:26

1

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

ghostintheshell 17.07.11 в 22:36

0

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

Mingun 21.09.11 в 15:27

0
+1

Таким образом, если mDistance - теперь меньше чем ноль, мы должны резко перескочить к пункту и настроить движение к следующему пункту.

ghostintheshell 19.07.11 в 20:34

0

Если mDistance меньше нуля, мы должны перепрыгнуть в целевую точку и продолжить движение к следующей точке.

Mingun 21.09.11 в 15:29

0

Отметьте, что мы устанавливаем mDirection в НУЛЕВОЙ вектор.

ghostintheshell 19.07.11 в 20:34

0

Обратите внимание, что мы устанавливаем mDirection в нулевой вектор.

Mingun 21.09.11 в 15:29

0

Если nextLocation метод не изменяет mDirection (то есть некуда пойти), тогда, мы больше не должны переместиться.

ghostintheshell 19.07.11 в 20:38

0

Если метод nextLocation() не изменяет mDirection (что означает, что больше некуда идти), мы не должны больше двигаться.

Mingun 21.09.11 в 15:31

0

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

ghostintheshell 19.07.11 в 20:38

0

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

Mingun 21.09.11 в 15:32

0

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

ghostintheshell 19.07.11 в 20:41

0

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

Mingun 21.09.11 в 15:35

0

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

ghostintheshell 19.07.11 в 20:46

0

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

Mingun 21.09.11 в 15:38

0
+2

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

ghostintheshell 19.07.11 в 20:53

0

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

Mingun 21.09.11 в 15:39

0

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

ghostintheshell 19.07.11 в 20:54

0

Поскольку робот уже идёт, нет никаких оснований говорить делать ему тоже самое.

Mingun 21.09.11 в 15:40

0

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

ghostintheshell 19.07.11 в 20:55

0

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

Mingun 21.09.11 в 15:41

0

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

ghostintheshell 19.07.11 в 20:59

0

Пока мы просто оставим комментарий в предложении else оператора if; запомните это место, поскольку мы позже к нему вернёмся.

Mingun 21.09.11 в 15:43

0

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

ghostintheshell 19.07.11 в 21:04

0

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

Mingun 21.09.11 в 15:45

0

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

ghostintheshell 19.07.11 в 21:08

0

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

Mingun 21.09.11 в 15:47

0

Это будет выполнено, если добавить следующий код:

ghostintheshell 19.07.11 в 21:10

0

Это достигается путём добавления следующего кода:

Mingun 21.09.11 в 15:47

0

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

ghostintheshell 19.07.11 в 21:14

0

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

Mingun 21.09.11 в 15:48

0

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

ghostintheshell 19.07.11 в 21:17

0

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

Mingun 21.09.11 в 15:49

0

Найдите функцию ITutorial01::nextLocation. Эти возвращения функции, ложные, когда заканчиваются пункты, чтобы пойти.

ghostintheshell 19.07.11 в 21:19

0

Найдите функцию ITutorial01::nextLocation(). Эта функция возвращает false, когда мы находимся в точке назначения.

Mingun 21.09.11 в 15:50

0

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

ghostintheshell 19.07.11 в 21:21

0

Это будет первая строка нашей функции. (Обратите внимание, что вы должны оставить оператор return true в конце функции.)

Mingun 21.09.11 в 15:51

0

Теперь мы должны установить переменные (все еще в nextLocation методе).

ghostintheshell 19.07.11 в 21:21

0

Теперь мы должны установить переменные (это всё ещё метод nextLocation()).

Mingun 21.09.11 в 15:52

0

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

ghostintheshell 19.07.11 в 21:23

0

Сначала мы достаём вектор назначения из очереди.

Mingun 21.09.11 в 15:53

0

Мы установим вектор направления, вычитанием текущего положения SceneNode из назначения.

ghostintheshell 19.07.11 в 21:26

0

Мы устанавливаем вектор направления путём вычитания текущей позиции SceneNode из вектора назначения.

Mingun 21.09.11 в 15:54

0

У нас есть проблема все же. Помните, как мы умножили mDirection количеством движения в frameRenderingQueued?

ghostintheshell 19.07.11 в 21:27

0

Тут у нас возникает проблема. Помните, что мы умножали mDirection на значение перемещения в методе frameRenderingQueued()?

Mingun 21.09.11 в 15:55

0

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

ghostintheshell 19.07.11 в 21:31

0

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

Mingun 21.09.11 в 15:57

0
Минутку...

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

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