При запуске программы появляется список с выбором приборов. Выбирая приборы, они появляются на сене и кнопки для регулировки их состояния становятся активными. При нажатии на кнопку прибора появляется список возможных его настроек. Помимо этого, появляясь на сцене приборы обладают такой функцией как перемещение, для этого достаточно кликнуть на него.
Все сказанное выше наглядно иллюстрируется в Приложение №2 при помощи блоксхемы.
Перемещение объектов по сцене.
Это задача разбивается на ряд блоков:
· Реализацию drag&drop
· Не пересекать объект с другими
· Обеспечить оптимальное срабатывание объектов, при нажатии на них мышкой.
Для того, чтобы реализовать drag & drop , необходимо чтобы при наведении и клике мышкой по объекту он точно распознавался.
Lamp_complete- это ссылка на объект, которые необходимо перемещать, в нашем случае это лампа. При наведении мышки на объект в DetectMouseCollision задается значении 1 и оно передается в переменную pick_conus.
Рис.37. DetectMouseCollision
Путь, который продемонстрирован на рисунке 38, иллюстрирует следующее событие:
При попадании мышки в рабочую зону, нажатии левой кнопки мыши и попадании мышкой на объект, мы говорим о том, что данный объект необходимо переместить.
Рис.38.Срабатывание объекта по клику мышки
Поскольку объект должен двигать строго за мышкой, нам необходимо знать все ее координаты, для этого необходимо использовать строительный блок – Mouse Intersect Plane XY. Он выдает координаты мышки на мониторе. Объекты в сцене должны перемещаться по X и Z, исключая движения по высоте. Для этого координаты мыши мы корректируем следующим образом:
Рис.39.Координаты мыши в трехмерном пространстве
В объект занимает то положение в сцене, что мышка. Отпустив левую кнопку мыши объект перестанет перемещаться и останется на том месте, где был в последний раз до того, как отпустится кнопка.
Не пересекать объект с другими
Реализовывается через канал FastCollisionResponse. В нем указывается позиция объекта, его смещение, происходящее при помощи мыши, радиус коллизии и объекты, с которыми нельзя пересекаться.
Рис.40. FastCollisionResponse
Поскольку тренажер трехмерный, а дисплей монитора двумерный, то велика вероятность некорректного срабатывания объектов при реализации механизма drag &drop.
Одной из таких проблем стала следующая ситуация:
Допустим, два объекта на сцене расположены друг за другом и при нажатии на один объект, второй, как правило тоже, срабатывает. В итоге перемещаются два объекта.
Во избежание этого был написан следующий код, который позволяет перемещать тот объект, который расположен ближе к пользователю:
Рис.41. Выбор минимального расстояния от камеры до объекта
Value Vector- указывает место расположения камеры наблюдателя.
Out: Movement Position-место расположение объекта.
Get distance- рассчитывает расстояние от камеры до объекта
Value- говорит кликнули на объект или нет
Expression Value- выбирает минимальное расстояние от камеры до объекта, на который кликнули.
Дальше при помощи канала select_object выбираем тот инструмент, которому принадлежит это расстояние.
Рис.42. Сравнения минимального значения со значениями объектов
У объектов не может быть одинаковых расстояний, поскольку они не пересекаются.
Выбрав при помощи оператора ifElse этот объект выбираем и задав 1 каналу drag, разрешаем его перемещать. Остальным объектам это запрещено.
Следует отметить еще один факт, который также может повлиять на некорректную работу с объектами - это наличие GUI-интерфейса.
Так при нажатии на кнопку или слайдер, если за ним расположен объект он может сработать на перемещение.
Избавиться от подобной ошибки можно следующим образом:
Рис.43. Избавить от срабатывания объектов при работе с интерфейсом
В этом коде указано, что если у нас мышка наведена но хотя бы одну кнопку интерфейса GUI. То нет возможности использовать канал select_object, которые осуществляет перемещение объектов по сцене.
На сцене существует ряд объектов. Это осветительные приборы, камера, мебель, зонтик.
Осветительные приборы должны осуществлять:
· Регулировку высоты светильника
· Изменение ширины распространение светового луча (регулировка створок)
· Изменение яркости света
· Изменение наклона лампы
Объект светильника состоит из следующих компонентов:
· Штатив
· Лампа
· Створки
· Источник света Quest3D
Длина штатива прямо зависит от положения бегунка на слайдере. Перемещая бегунок, тем самым изменяем размер объекта с 0.5 до 2.6
Рис.44. Изменение длины штатива
Помимо изменения высоты светильника, необходимо изменять Y-координату лампы и створок.
Регулировка наклона происходит при помощи четырех кнопок, расположенных в углу интерфейса. Кнопки вверх, вниз означают наклон светильника, влево, вправо - вращение.
Светильник может вращаться на 360 градусов. А наклон его ограничен некоторыми параметрами и реализуется за счет канала Limit absolute value , в котором указывают предельные значения .
Чтобы добиться этого эффекта, изменяем вектор Rotation.
Рис.45. Изменение наклона лампы
Необходимо для изменения радиуса распространения светового луча. Движущиеся створки представляют собой 2 пластины, которые либо сужают, либо увеличивают свет.
Каждая пластина изначально вращалась вокруг своей оси. Но для реализации эффекта двери, нужно сменить осевую точку на боковое ребро пластины. Для этого канале MATRIX указываются координаты расположения ее оси
Рис.46. Задание осевой точки
Регулируем створками при помощи слайдера. Соответственно изменение наклона створок, зависит от положения бегунка.
Рис.47. Регулировка створок
Помимо этой возможности створки должны вращаться вместе лампой, то есть фактически у них должно существовать две оси. Реализуется это следующим образом: створкам задается родительский параметр, в котором их осью становится центральная точка лампы.
Рис.48. Задание второй осевой точки
От изменения игла створок зависит радиус света. Для этого делаем так, чтобы радиус источника света тоже зависел от положения бегунка, которые регулирует створки.
Рис.49. Регулировка радиуса источника света
За радиус источника света отвечает канал Phi, к которому и подключен слайдер.
Реализуется при помощи изменения канала Diffuse источника света. Также как в регулировке высоты прямо зависит от расположения бегунка на слайдере.
Рис.50. Изменение яркости светильника
В результате всех произведенных настроек с осветительным прибором, можно сказать ,что все его функции реализованы.
Фактически у данных объектов нет как таковых параметров настроек. Стул и стол могут исключительно только перемещаться по сцене.
Его интерактивные возможности заключаются в изменении наклона и места позиции.
В камере реализована регулировка высоты, наклона и вращения, которые настроены аналогичным образом, что и у светильников. Но помимо этого камера имеет такую интерактивную возможность как zoom.
Регулируется при помощи бегунка, который задает параметры в канал Zoom Factor
Value=1 и Value=5- ограничивают zoom
Рис.51. Zoom камеры
Камера помимо трехмерного объекта включает в себя камеру Quest3D.
В проекте существует возможность перехода от общего плана сцены, непосредственного к просмотру обстановки студии через камеру.
Для этого создан следующий код:
Рис.52. Переход с камеры на камеру
Toggle/FlipFlop triggered- нажата кнопка студийная съемка-1, нажата кнопка студия-0
Basic Camera- представляет общую сцену проекта (студия)
Scene_camera- камера на сцене (студийная съемка)
Соответственно в зависимости от значения Toggle/FlipFlop triggered имеем различные планы студии.