Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 4: Frame Listeners and Unbuffered Input

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

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

Теперь нам нужно установить значение переменной mMouseDown независимой от того, что содержит переменная currMouse.

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

proVIDec 08.07.11 в 06:33

0

Скомпилируйте и запустите приложение.

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

Так как мы вызвали метод frameRenderingQueued, мы до сих пор можем двигать камеру используя клавиши WASD.

proVIDec 28.06.11 в 09:24

0

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

proVIDec 08.07.11 в 06:34

0

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

proVIDec 08.07.11 в 06:37

0

Обойти это можно следующим способом. Для этого нужно отслеживать время с момента, когда кнопка была нажата в последний раз и позволять совершать только одно действие по прошествии времени.
Мы отслеживаем это время в переменной mToggle .

proVIDec 08.07.11 в 07:54

0

Если mToggle больше 0, то мы не выполняем какие-либо действия. Если mToggle меньше 0, тогда мы можем выполнить действие.

Мы будем использовать этот метод для двух клавиш.

proVIDec 08.07.11 в 07:56

0

Первое, что мы хотим сделать, уменьшать переменную mToggle через определенное время, прошедшее с момента последнего фрейма.

proVIDec 29.06.11 в 12:15

0

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

proVIDec 29.06.11 в 12:44

0

По сути mToggle это пол секундная задержка, до конца которой никакие изменения не происходят.

proVIDec 29.06.11 в 13:11

0

На практике эта задержка дольше, но так нам и нужно.

proVIDec 08.07.11 в 08:25

0
+2

Давайте добавим альтернативный способ переключения света:

proVIDec 28.06.11 в 09:25

0

Скомпилируйте и запустите приложение. Теперь мы можем включать и выключать свет, нажимая на клавишу "1".

proVIDec 27.06.11 в 10:31

0

Следующее, что нам нужно сделать, это реализовать перемещение нода с привязанному к нему ниндзя, путем нажатия клавиш IJKL.

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

Это делает наш код в разы проще.

Для начала давайте создадим Vector3 и определимся, куда мы будем двигать объект:

proVIDec 30.06.11 в 05:43

0

Теперь мы хотим, чтобы при зажатой клавише "I" объект двигался вперед (а именно по отрицательной оси z. Помните, отрицательная ось z уходит прямо в экран?) :

proVIDec 29.06.11 в 13:05

0

Делаем почти тоже самое для клавиши "K", но движение будет происходить по положительной части оси z:

proVIDec 29.06.11 в 12:50

0

Движения влево и вправо происходит по оси x (положительная и отрицательная части). Поворот влево/вправо (при зажатом shift) так же происходит по оси x:

proVIDec 29.06.11 в 12:59

0

Ну а в движение вверх/вниз, регулируемое клавишами "U" и "O", будет задействована ось y:

proVIDec 29.06.11 в 13:00

0

Теперь в нашей переменной transVector находится перемещение, которое мы хотели бы применить на ноде камеры.

proVIDec 29.06.11 в 14:11

0

Первая ловушка с которой мы можем столкнуться, это то, что если вы поворачиваете SceneNode, то наши x, y и z координаты при перемещении будут другие.

proVIDec 08.07.11 в 08:27

0

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

proVIDec 08.07.11 в 08:30

0

На деле это проще, чем звучит.

proVIDec 28.06.11 в 07:10

0

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

proVIDec 28.06.11 в 07:26

0

Вместо этого, для всех операций связанных с поворотом и вращениями, он использует Кватернионы .

proVIDec 28.06.11 в 07:24

0

В математике Кватернионы имеют отношение к четырехмерной линейной алгебре. Сложно правда?

proVIDec 28.06.11 в 13:16

0

К счастью вам не нужно понимать устройство Кватернионов для работы с ними.

proVIDec 28.06.11 в 13:13

0

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

proVIDec 08.07.11 в 14:07

0

В таком случае, нам нужно применить все вращения, совершенные со SceneNode, на вектор перемещения.

proVIDec 08.07.11 в 08:32

0

Мы можем получить Кватернионы, представляющие эти вращения, вызовом SceneNode::getOrientation(), потом мы уже можем применить их к перемещаемому ноду (умножить).

proVIDec 08.07.11 в 11:01

0

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

proVIDec 08.07.11 в 08:34

0

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

proVIDec 30.06.11 в 05:28

0

Определенно не то, чего мы хотели.

proVIDec 28.06.11 в 14:28

0

Вот вызов функции, который нам нужен для перемещения нода с камерой без возникновения данных проблем:

proVIDec 08.07.11 в 06:16

0

Сейчас мы узнали кое-что новое.

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

proVIDec 29.06.11 в 13:49

0

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

proVIDec 29.06.11 в 13:51

0

По умолчанию это TS_PARENT, то есть объект двигается в пространстве преобразования в котором находиться его родительский нод. В данном случае родителем является корневой нод.

proVIDec 08.07.11 в 10:09

0

Когда мы нажимаем клавишу "I" (для движения вперед), мы вычитаем из направления z, то есть движемся в направлении отрицательной оси z.

proVIDec 29.06.11 в 17:20

0

Если бы в предыдущей строке кода мы не прописали пространство TS_LOCAL, то тогда бы мы двигали ниндзя по отрицательной оси z.

proVIDec 08.07.11 в 06:27

0

Однако, поскольку мы пытаемся заставить ниндзя двигаться вперед при нажатии на клавишу "I", нам нужно двигать его по направлению, к которому нод повернут лицом.

proVIDec 03.07.11 в 03:41

0

Таким образом, нам нужно использовать "локальное" пространство преобразования.

proVIDec 03.07.11 в 03:42

0

Существует и другой способ реализации этого (хотя и менее простой).

proVIDec 29.06.11 в 07:38

0

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

proVIDec 08.07.11 в 06:29

0

Это было бы вполне допустимо:

proVIDec 29.06.11 в 07:39

0
+1

Так же это перемещает нод ниндзя в локальном пространстве.

proVIDec 29.06.11 в 14:14

0

В нашем случае, нет никаких причин делать так.

proVIDec 29.06.11 в 14:17

0

Ogre поддерживает три пространства преобразования: TS_LOCAL, TS_PARENT и TS_WORLD.

proVIDec 29.06.11 в 13:52

0

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

proVIDec 08.07.11 в 06:22

0

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

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

proVIDec 08.07.11 в 10:54

0

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

proVIDec 08.07.11 в 10:57

0

Скомпилируйте программу и опробуйте ее.

proVIDec 28.06.11 в 06:28

0

Данный туториал не является полным руководством по вращению и Кватернионам (здесь достаточна материала для усвоения).

proVIDec 30.06.11 в 05:24

0
Минутку...

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

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