Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 4: Frame Listeners and Unbuffered Input
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Теперь нам нужно установить значение переменной mMouseDown независимой от того, что содержит переменная currMouse. proVIDec 08.07.11 в 06:33 |
|
|
Скомпилируйте и запустите приложение. proVIDec 28.06.11 в 09:24 |
||
|
Такой способ хранения предыдущее состояние кнопки мыши работает хорошо, поскольку мы знаем, что мышь уже была задействована. proVIDec 08.07.11 в 06:34 |
||
|
Недостатком является то, что для того, чтобы использовать это для каждой клавиши (к которой привязано действие), нам нужна булева переменная. proVIDec 08.07.11 в 06:37 |
||
|
Обойти это можно следующим способом. Для этого нужно отслеживать время с момента, когда кнопка была нажата в последний раз и позволять совершать только одно действие по прошествии времени. proVIDec 08.07.11 в 07:54 |
||
|
Если mToggle больше 0, то мы не выполняем какие-либо действия. Если mToggle меньше 0, тогда мы можем выполнить действие. proVIDec 08.07.11 в 07:56 |
||
|
Первое, что мы хотим сделать, уменьшать переменную mToggle через определенное время, прошедшее с момента последнего фрейма. proVIDec 29.06.11 в 12:15 |
||
|
Теперь, когда мы определились с переменной mToggle, мы можем использовать ее. proVIDec 29.06.11 в 12:44 |
||
|
По сути mToggle это пол секундная задержка, до конца которой никакие изменения не происходят. proVIDec 29.06.11 в 13:11 |
||
|
На практике эта задержка дольше, но так нам и нужно. proVIDec 08.07.11 в 08:25 |
+2 | |
|
Давайте добавим альтернативный способ переключения света: proVIDec 28.06.11 в 09:25 |
||
|
Скомпилируйте и запустите приложение. Теперь мы можем включать и выключать свет, нажимая на клавишу "1". proVIDec 27.06.11 в 10:31 |
||
|
Следующее, что нам нужно сделать, это реализовать перемещение нода с привязанному к нему ниндзя, путем нажатия клавиш IJKL. proVIDec 30.06.11 в 05:43 |
||
|
Теперь мы хотим, чтобы при зажатой клавише "I" объект двигался вперед (а именно по отрицательной оси z. Помните, отрицательная ось z уходит прямо в экран?) : proVIDec 29.06.11 в 13:05 |
||
|
Делаем почти тоже самое для клавиши "K", но движение будет происходить по положительной части оси z: proVIDec 29.06.11 в 12:50 |
||
|
Движения влево и вправо происходит по оси x (положительная и отрицательная части). Поворот влево/вправо (при зажатом shift) так же происходит по оси x: proVIDec 29.06.11 в 12:59 |
||
|
Ну а в движение вверх/вниз, регулируемое клавишами "U" и "O", будет задействована ось y: proVIDec 29.06.11 в 13:00 |
||
|
Теперь в нашей переменной transVector находится перемещение, которое мы хотели бы применить на ноде камеры. proVIDec 29.06.11 в 14:11 |
||
|
Первая ловушка с которой мы можем столкнуться, это то, что если вы поворачиваете SceneNode, то наши x, y и z координаты при перемещении будут другие. proVIDec 08.07.11 в 08:27 |
||
|
Чтобы исправить это нам нужно применить все повороты, которые мы сделали со SceneNode, на наш нод для движения. proVIDec 08.07.11 в 08:30 |
||
|
На деле это проще, чем звучит. proVIDec 28.06.11 в 07:10 |
||
|
Для вращения Ogre не использует матрицы преобразования, как некоторое графические движки. proVIDec 28.06.11 в 07:26 |
||
|
Вместо этого, для всех операций связанных с поворотом и вращениями, он использует Кватернионы . proVIDec 28.06.11 в 07:24 |
||
|
В математике Кватернионы имеют отношение к четырехмерной линейной алгебре. Сложно правда? proVIDec 28.06.11 в 13:16 |
||
|
К счастью вам не нужно понимать устройство Кватернионов для работы с ними. proVIDec 28.06.11 в 13:13 |
||
|
Проще говоря, чтобы использовать Кватернионы, для поворота вектора, все что вам нужно сделать, это перемножить две части. proVIDec 08.07.11 в 14:07 |
||
|
В таком случае, нам нужно применить все вращения, совершенные со SceneNode, на вектор перемещения. proVIDec 08.07.11 в 08:32 |
||
|
Мы можем получить Кватернионы, представляющие эти вращения, вызовом SceneNode::getOrientation(), потом мы уже можем применить их к перемещаемому ноду (умножить). proVIDec 08.07.11 в 11:01 |
||
|
Вторая ловушка, которую нужно остерегаться, это то, что нам нужно уменьшить величину нашего передвижения на величину времени прошедшего с последнего фрейма. proVIDec 08.07.11 в 08:34 |
||
|
Иначе скорость перемещения будет зависеть от частоты кадров в секунду. proVIDec 30.06.11 в 05:28 |
||
|
Определенно не то, чего мы хотели. proVIDec 28.06.11 в 14:28 |
||
|
Вот вызов функции, который нам нужен для перемещения нода с камерой без возникновения данных проблем: proVIDec 08.07.11 в 06:16 |
||
|
Сейчас мы узнали кое-что новое. proVIDec 29.06.11 в 13:49 |
||
|
Обычно, когда вы двигаете объект, вам не нужно указывать этот параметр. proVIDec 29.06.11 в 13:51 |
||
|
По умолчанию это TS_PARENT, то есть объект двигается в пространстве преобразования в котором находиться его родительский нод. В данном случае родителем является корневой нод. proVIDec 08.07.11 в 10:09 |
||
|
Когда мы нажимаем клавишу "I" (для движения вперед), мы вычитаем из направления z, то есть движемся в направлении отрицательной оси z. proVIDec 29.06.11 в 17:20 |
||
|
Если бы в предыдущей строке кода мы не прописали пространство TS_LOCAL, то тогда бы мы двигали ниндзя по отрицательной оси z. proVIDec 08.07.11 в 06:27 |
||
|
Однако, поскольку мы пытаемся заставить ниндзя двигаться вперед при нажатии на клавишу "I", нам нужно двигать его по направлению, к которому нод повернут лицом. proVIDec 03.07.11 в 03:41 |
||
|
Таким образом, нам нужно использовать "локальное" пространство преобразования. proVIDec 03.07.11 в 03:42 |
||
|
Существует и другой способ реализации этого (хотя и менее простой). proVIDec 29.06.11 в 07:38 |
||
|
Чтобы получить тот же результат, мы могли бы взять направление нода и Кватерниона и умножить их на направление вектора. proVIDec 08.07.11 в 06:29 |
||
|
Это было бы вполне допустимо: proVIDec 29.06.11 в 07:39 |
+1 | |
|
Так же это перемещает нод ниндзя в локальном пространстве. proVIDec 29.06.11 в 14:14 |
||
|
В нашем случае, нет никаких причин делать так. proVIDec 29.06.11 в 14:17 |
||
|
Ogre поддерживает три пространства преобразования: TS_LOCAL, TS_PARENT и TS_WORLD. proVIDec 29.06.11 в 13:52 |
||
|
Может случиться так, что вам нужно будет осуществить перемещение или вращение в другом векторном пространстве. proVIDec 08.07.11 в 06:22 |
||
|
В таком случае это можно попытаться реализовать, как в предыдущем коде. proVIDec 08.07.11 в 10:54 |
||
|
Этот метод довольно долгое время не использовали и мы не будем упоминать его в последующих туториалах. proVIDec 08.07.11 в 10:57 |
||
|
Скомпилируйте программу и опробуйте ее. proVIDec 28.06.11 в 06:28 |
||
|
Данный туториал не является полным руководством по вращению и Кватернионам (здесь достаточна материала для усвоения). proVIDec 30.06.11 в 05:24 |
