Готовый перевод Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 8: Multiple and Dual SceneManagers
КРАТКОЕ СОДЕРЖАНИЕ
В этом коротком туториале мы изучим, как переключаться между несколькими менеджерами сцены.
ДЛЯ НАЧАЛА
ПЕРВОНАЧАЛЬНЫЙ КОД
Измените заголовочный файл класса из Базового Руководства 8, чтобы он выглядел так.
Убедитесь, что файл реализации из Базового Руководства 7, выглядит так.
Убедитесь, что можете скомпилировать код, прежде чем продолжать. При запуске программы будет отображаться лишь черный экран. Нажмите Esc, чтобы выйти.
СОЗДАНИЕ ПРИЛОЖЕНИЯ
СОЗДАНИЕ МЕНЕДЖЕРОВ СЦЕНЫ
Мы уже описали то, как выбирать ваш SceneManager, поэтому я не буду подробно рассказывать об этой функции.
Единственной вещью, которую мы изменили, является то, что мы создаем две из них.
Найдите функцию chooseSceneManager и добавьте в нее следующий код:
СОЗДАНИЕ КАМЕР
Следующая вещь, которую нам нужно сделать - это создать объект Camera для каждого из двух экземпляров SceneManager.
Единственное отличие от предыдущих разделов руководства является то, что мы создаем две из них с одинаковыми именами.
Найдите функцию createCamera и добавьте следующий код:
СОЗДАНИЕ ОБЛАСТЕЙ ПРОСМОТРА
При создании Viewport для этого приложения, мы будем брать небольшое отступление от предыдущих руководств.
Когда вы создаете Viewport, вы должны сделать две вещи: установить сам Viewport и затем установить соотношение геометрических размеров камеры, которую вы используете.
Начнем с того, что добавим следующий код в функцию createViewports :
Текущий код устанавливает принадлежность Viewport в нашей функции setupViewport(), так как мы используем этот код снова в другом месте.
Первая вещь, которую нам нужно сделать это убрать все уже созданные объекты Viewport.
Еще ничего не было создано, но когда мы позже снова вызовем эту функцию, нам нужна будет помощь, чтобы убедиться, что они убрали все, до того как создавать новые.
После этого мы будем устанавливать Viewport как мы уже делали в предыдущих руководствах.
Добавьте следующий код в функцию setupViewport() в верх этого файла:
СОЗДАНИЕ СЦЕНЫ
И наконец, нам нужно создать сцену для каждого SceneManager, чтобы на ней были объекты.
Мы не будем делать ничего сложного, просто кое-что отличное так как мы знаем, когда мы уже менялись местами между ними.
Найдите функцию createScene и добавьте следующий код:
Прежде чем продолжать, убедитесь, что ваш код компилируется.
Запуск программы должен показать космический skybox.
Пока это все.
ДОБАВЛЕНИЕ ФУНКЦИОНАЛЬНОСТИ
ДВОЙНЫЕ МЕНЕДЖЕРЫ СЦЕНЫ
Первая порция функциональности, которую нам нужно добавить в эту программы сделана, чтобы позволить пользователи рендерить оба объекта SceneManager бок о бок.
Когда нажата кнопка V мы будем переключать двойной режим объекта Viewport.
Основной план для этого прост.
Чтобы выключить режим Viewport, мы просто вызовем setupViewport(которой сделан в предыдущей секции) с главным SceneManager, чтобы переделать этот Viewport в одиночный режим.
Когда мы хотим включить его, мы будем вызывать новую функцию, называемую dualViewport.
Мы будем отслеживать состояние объекта Viewport с помощью переменной mDual.
Добавьте следующий код в конец функции keyPressed():
Теперь у нас переменная mDual переключена и вызвана соответствующая функция в зависимости от того, каком режиме мы находимся.
Теперь мы будем определять функцию dualViewport(), которая на самом деле содержит код, который покажет вместе два объекта Viewport.
Чтобы выводит два объекта SceneManager бок о бок, мы по существу сделаем ту же вещь, что мы уже делали с функцией setupViewport().
Существует только одно отличие и оно состоит в том, что мы будем делать два объекта Viewport, по одному на каждую камеру в наших объектах SceneManager.
Добавьте к функции dualViewport() следующий код :
Все это уже должно быть вам знакома, за исключением дополнительных параметров, которые мы добавили в вызов функции addViewport.
Первый параметр переданный в эту функции все еще объект Camera, который мы используем.
Второй параметр - это направление по оси z объекта Viewport.
Более высокое положение на оси z расположено сверху более низкого положения на оси z.
Отметим, что у вас не может быть двух объектов Viewport с одним и тем же положением на оси z, даже если они не пересекаются.
Следующие два параметра - это левая и верхняя позиции объекта Viewport, которые должны быть от 0 до 1.
И наконец, последние два параметра - это ширина и высота объекта Viewport, как процент от экрана (и снова, они должны быть от 0 до 1).
Поэтому, в этом случае, первый Viewport, который мы сделали будет в точке (0, 0) и будет занимать половину экрана горизонтально и целый экран вертикально.
Второй Viewport будет в положении (0.5, 0) и занимает половину горизонтально места и все вертикальное место.
Скомпилируйте и запустите это приложение. Нажав V вы можете вывесте два объекта SceneManager одновременно.
СМЕНА МЕСТА SCENEMANAGER
Последняя часть функциональности, которую мы хотим добавить к нашей программе - это менять местами объекты SceneManager, когда мы нажимаем кнопку C.
Чтобы это сделать, мы поменяем местами переменные primarySceneMgr и secondarySceneMgr так, чтобы когда вызывается функция setupViewport() или dualViewport(), и нам никогда не нужно будет заботиться, какой SceneManager находится в какой переменной.
Первичный SceneManager всегда будет выводиться в одиночном режиме, и этот первичный всегда будет на левой стороне в режиме dualViewport.
Добавьте следующий код в конец функции keyPressed():
После того, как поменяли местами переменные SceneManager, нам нужно произвести замену.
Все, что нам нужно сделать - это вызвать соответствующую функцию установки объекта Viewport в зависимости от того, были ли мы в двойном или одиночном режиме.
Вот и все!
Скомпилируйте и запустите приложение.
Теперь мы можем переключаться между менеджерами сцен с помощью клавиши "C" и переключаться между одиночным и двойным режимом камеры с помощью клавиши "V".
ВЫВОД
ВЕРХНИЕ СЛОИ(ОВЕРЛЕИ)
Я уверен, что вы заметили в вашей программе, что когда вы запускаете ее в двойном режиме Viewport, отладчик оверлеев OGRE показывается на обоих сторонах.
Вы можете выключить рендеринг Оверлеев в основании каждого объекта Viewport.
Используйте функцию Viewport::setOverlaysEnabled, чтобы их включать и выключать.
Я сделал относительно простое изменение к полному исходному коду этого руководства, поэтому если вы смущены тем, как это делается, посмотрите эту страницу за подробностями.
ОДНО ПОСЛЕДНЕЕ ЗАМЕЧАНИЕ
Всегда имейте в виду, что класс класс, не имея сам по себе богатую функциональность, является ключом ко всему рендерингу Ogre.
Не имеет значение, сколько объектов SceneManager вы сделали и сколько камер в каждом SceneManager, ничего из этого не будет рендериться на окне, до тех пор, пока вы не установите Viewport для каждой показываемой камеры.
И также не забудьте отчистить Viewports, которые вы не используете, до тех пор, пока не сделаете еще.
Переведено на Нотабеноиде
http://notabenoid.org/book/19615/64010
Переводчики: wuffur, proVIDec, cin
Настройки
Готово:
