Simulation Manager - плагин, который позволяет связать сторонний программный код или скрипт с ПО VR Concept для взаимодействия с моделью и создания динамики в сцене. Связь происходит с помощью UDP.
Получение и отправка происходит чтением и отправкой единой датаграммы.
Пакет (как на отправку и прием) является массивом из элементов типа double.
Индекс массива является индексом параметра.
Весь массив должен передаваться одним пакетом (текущее ограничение), поэтому размер массива должен быть не больше размера минимальной целой датаграммы, которую может отправить сетевое оборудование (смотрите стандарт UDP).
Пример на вход/выход: 0.13 0.2 0 0 0.4 (vector<double>). Угол передается в градусах, параметр звука (1 - 100) - громкость, в цвете - каждые байт отводится на R,G,B.
1. Запустите приложение “VR Concept Launcher” и добавьте модель в сцену
2. Перейдите на вкладку “Плагины” в боковом меню (слева)
3. Перейдите на вкладку “Плагины” в верхнем меню и нажмите кнопку “добавить плагин” (розетка со знаком +)
4. В открывшемся окне найдите плагин SimulationManager (Менеджер симуляции) и поставьте галочку в окошке рядом с ним. Нажмите “ок”.
5. Перейдите на вкладку “сцена” в боковом меню (слева), затем нажмите правой кнопкой мыши на модель в дереве сцены. Выберите “Добавить свойство”>”Симуляция параметров”
6. Теперь, в разделе “Свойства объекта” (справа), появилось меню плагина Simulation Manager - “Симуляция параметров”
1. Для настройки плагина Simulation Manager требуется перейти на вкладку “Плагины” в боковом меню (слева), а затем, в списке плагинов, найти и выбрать (левой кнопкой мыши) плагин “Simulation Manager”.
2. После этого, в меню “Свойства объектов” (справа), откроется окно настройки плагина.
3. В окне настройки плагина можно установить следующие параметры:
Тэг наблюдателя (Humaninput Tag) - указывается тэг наблюдателя, положение и ориентацию головы которого необходимо отслеживать. По умолчанию можно оставить поле пустым.
Адрес хоста - можно прописать адрес хоста (VR Concept). По умолчанию значение 127.0.0.1
Порт для приёма - порт для приёма данных в VR Concept. По умолчанию 6501.
Порт для отправки - порт для отправки данных из VR Concept. По умолчанию значение 6502.
Размер буфера для отправки - количество данных, которое может передавать VR Concept за один раз. Рекомендуем выставлять значение большее или равное 10.
Передавать положение головы - включение передачи положения головы.
Индекс положения головы в выходном массиве - индекс положения головы в выходном массиве.
Передавать ориентацию головы - включение передачи ориентации головы.
Индекс ориентации головы в выходном массиве - индекс ориентации головы в выходном массиве.
Имя группы – название группы.
Переопределяемая группа – параметр, которое делает группу объектов самостоятельным элементом сцены.
Количество величин для симуляции – количество данных которые мы будем передавать в VR Concept.
Количество возвращаемых величин - количество данных которые мы будем принимать из VR Concept.
Показывать окно – отображение окна, где показаны параметры.
Показывать заголовок – поставить галочку, если нужен заголовок у поля.
Текст заголовка - задать статический текст заголовка окна.
Ширина окна - задать ширину окна в метрах.
Привязать положение окна – привязка положения окна к положению объекта.
Положение окна – перемещение окна.
Ориентация окна - вращение окна.
Настройка величин для симуляции - запись параметров которые мы будем передавать в VR Concept.
Настройка возвращаемых величин - запись параметров которые мы будем принимать из VR Concept.
В свойстве "Настройка величин для симуляции " - формат записи: <тип>:<индекс>:<пар2>:<пар3>:<пар4>.
<тип> - команда, которую нужно выполнить при входящем пакете.
<индекс> - индекс параметра входящего пакета.
1. Тип "move" - перемещение объекта.
Пример: move:0:1.0:1,1,1 (0 - индекс:1.0 - коэффициент масштабирования:1,1,1 - перемещение по осям)
2. Тип "rotate" - вращение объект.
Пример: rotate:1:1.0:1,0,0 (1 - индекс:1.0 - коэффициент масштабирования:1,0,0 - поворот по оси X)
Пример: rotate:2:1.0:0,1,0 (2 - индекс:1.0 - коэффициент масштабирования:0,1,0 - поворот по оси Y)
Пример: rotate:3:1.0:0,0,1 (3 - индекс:1.0 - коэффициент масштабирования:0,0,1 - поворот по оси Z)
3. Тип "display" - вывести в окно значение.
Пример: display:2:1:Так :4 (2 - индекс:1 - количество символов после запятой: “Так”:4 - сдвиг значения от описания )
4. Тип "sound" - вывести звук.
Задавать элементу модели.
Форматы, которые можно использовать: mp3, wav, flac, acc, ogg, mp4, mkv, webm
Команды для отправки:
"<индекс> 0" - остановить воспроизведение.
"<индекс> (от 0 до 1)" - громкость проигрывания (запуск проигрывания: 1).
Чтобы запустить звук еще раз, после одиночного проигрывания, сначала остановите воспроизведение и отправьте запуск проигрывания еще раз.
Пример: sound:3:step1.wav (3 - индекс:step1.wav - файл который необходимо проиграть. Файл проигрывается один раз.)
Пример: sound:4:LOOP:step1.wav (3 - индекс:LOOP - музыка проигрывается циклично:step1.wav - файл который необходимо проиграть)
5. Тип "ambient","diffuse","specular","emission","shininess", “opacity” - материал объекта.
См. свойство “Материал”.
Для "shininess", “opacity” - показатель блеска, прозрачность:
Пример: opacity:4:1 (4 - индекс:1 - значение непрозрачности)
Для"ambient","diffuse","specular","emission" - амбиентный цвет, диффузный цвет, цвет свечение, цвет бликов:
Пример: ambient:5 (5 - индекс)
Передаётся число - 479132
479132 / 256 = 1871 (Остаток 156)
1871 / 256 = 7 (Остаток 79)
7 / 256 = 0 (Остаток 7)
RGB код будет равен (156, 79, 7)
6. Тип “animation” - проигрывание анимации.
Необходимо применять только на корневой элемент объекта, у которого есть свойство “Параметры анимации”.
На данный момент возможно проигрывание только оригинальных анимаций.
Пример: animation:0:Take 001:LOOP(0 - индекс:Take 001 - Имя анимации которую нужно проиграть:LOOP - проигрывать циклично)
Команды для отправки:
"<индекс> 0" - остановить воспроизведение для LOOP, ONCE.
"<индекс> 1" - запуск анимации для LOOP, ONCE.
"<индекс> -1" - запуск анимации в обратном порядке для LOOP, ONCE.
"<индекс> (от 0 до 1)" - замедление воспроизведение анимации.
"<индекс> 1" - сброс для RESET.
7. Тип: "scale" - масштабирование.
Пример: scale:0:1.0:2,2,2 (0 - индекс:1.0 - коэффициент масштабирования:2,2,2 - масштабирование по осям)
В свойстве "Настройка возвращаемых величин" - формат записи: <тип>:<индекс>:<пар2>:<пар3>.
<тип> - команда, которую нужно выполнить при выходящем пакете.
<индекс> - индекс параметра выходящего пакета.
1. Тип "rot_angle" - отправить поворот объекта
Пример: rot_angle:0:0,45 (0-индекс:0 - минимальный, 45 - максимальный угол)
После написания команды добавляется свойство “Вращение вокруг оси”.
Необходимо указать следующие параметры:
- Центр вращения в центре детали(включить\выключить при необходимости);
- Центр вращения(настроить при необходимости);
- Ограничить вращение(активировать);
- Минимальный/Максимальный угол(задать значения минимального и максимального угла вращения, которые написаны указаны в команде).
2. Тип "position" - получить позицию объекта (передаётся в трёх строках, тремя параметрами для трёх осей XYZ)
Пример: position:23:0:1,0,0 (23 - индекс:0 - глобальные координаты:1,0,0 - по оси X)
Пример: position:24:0:0,1,0 (24 - индекс:0 - глобальные координаты:0,1,0 - по оси Y)
Пример: position:25:0:0,0,1 (23 - индекс:0 - глобальные координаты:0,0,1 - по оси Z)
3. Тип "orientation" - ориентация в пространстве.
Пример: orientation:31:0 (31 - индекс:0 - глобальная ориентация)
Возвращается 3 значения по индексам 31, 32, 33.
4. Тип "scale" - получить масштаб объекта (передаётся в трёх строках, тремя параметрами для трёх осей XYZ)
Пример: scale:26:0:1,0,0 (26 - индекс:0 - глобальный масштаб:1,0,0 - по оси X)
Пример: scale:27:0:0,1,0 (27 - индекс:0 - глобальный масштаб:0,1,0 - по оси Y)
Пример: scale:28:0:0,0,1 (28 - индекс:0 - глобальный масштаб:0,0,1 - по оси Z)
Тестер - это небольшая программа написанная на языке Python для демонстрации минимальных возможностей работы с плагином SimulationManager в VR Concept по UDP.
Для реализации сложных сценариев можно использовать любую подходящую программу, в которой присутствует возможность подключения по UDP, в том числе и самописную. Пример работы с одной из таких программ (SimInTech) можно посмотреть здесь.
Изначально тестер не требует никакой настройки. Здесь мы расскажем о файле “config.json”. В нём вы можете изменить настройки, если стандартные вам, по какой-либо причине, не подходят.
1. Открываем файл “config.json”
2. В нём мы видим следующие настройки:
“max log files” - отвечает за максимальное количество созданных “log” файлов.
“max log size” - отвечает за максимальный размер лога.
“outputs” - отвечает за количество выходных значений для симулятора.
“recv port” - IP/UDP порт приема.
“send port” - IP/UDP порт отправки.
“send url” - IPv4 VRConcept'а.
В папке “logs” находятся файлы логов. В них отображаются все действия проводимые через тестер, а также все данные, которые VR Concept “возвращает” тестеру.
Данный файл мы рекомендуем открывать с помощью программы NotePad++, так как при открытии с помощью стандартного блокнота вам придется каждый раз закрывать и открывать файл, чтобы увидеть обновления. К тому же, файл “log” открытый в блокноте ограничен по размеру, и из за этого тестер будет создавать дополнительные файлы “log”, что не очень удобно.
1. Запускаем программу “VR Concept Launcher” и “VR Concept Client Daemon”.
2. Добавляем плагин SimulationManager, настраиваем его:
3. Запускаем файл “VRCSimTester.exe”
4. Выбираем плагин HumanInput. Он находится в плагине с именем “Тэг клиента”, который указан в “VR Concept Client Daemon”.
1. В свойстве объекта раскроем “Параметры головы”. Изменяем параметры “Смещение трекера” и “Поворот трекера”.
2. Запускаем Steam VR. Также необходимо запустить приложение для вашего VR шлема
3. Запускаем VR в “VR Concept Launcher”.
4. Открываем файл log в папке logs и видим значения положения и ориентации головы клиента.
Лекция “UDP в проектной деятельности”