CutzMF

OpenTrack и кнопки/оси джойстика для управления обзором (и более сложные вариации)

Всем привет!

Частенько появляются темы о невозможности управления кнопками/осями джойстика смещениями головы при установленном OpenTrack, развенчаем миф и на практике с примерами покажем что делать.

Вводная(читаем далее, если и так всё понятно)

Скрытый текст

Есть два протокола передачи данных движения головы (6DOF) в игру:

  • Freetrack
  • TrackIR

При установлненых библиотеках/драйверах этих протоколов игры блокируют свои внутренние схемы управления обзором через кнопки/оси и ограничивают ввод этими протоколами и это логично потому что протокол поддерживает все 6 осей свободы 6DOF (в трёхмерном мире есть 3 оси X,Y,Z, свободы - это вращение вокруг этих осей и сдвиги по ним, в сумме 6 степеней)

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

Что можно сделать?

Кроме известных и массово используемых Opentrack, FaceTrackNoir, FreeTrack существует ещё FreePIE (скачиваем, устанавливаем)

Скрытый текст

FreePIE (Programmable Input Emulator) Программа эмуляции и совмещения устройств ввода, первоначально созданная для видеоигр. Использует простой синтаксис Python языка и предлагает простую работу/скрипты с устройствами даже для непрограммистов. Поддерживает протоколы TrackIR, FreeTrack, joystick, mouse, keyboard и множество других.

Грубо говоря позоволяет сделать всё тоже самое, что и Opentrack(и другие программы), но с малым количеством программирования.

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

Для создания сложных схем управления можно использовать передачу данных из одной программы в другую:

  1. FreePIE >> Opentrack
  2. Opentrack/FreeTrack/FTNoir >> FreePIE >> Opentrack (для суммирования ввода с разных устройств)
  3. Opentrack + внутренние python скрипты (скоро появится в релизе и скорее всего объеденит возможности в одной программе)

Реализуем парочку примеров.

Запускаем Opentrack и FreePIE.

Настраиваем Opentrack ввод(input) UDP sender, порт 5555 (возможно брэндмауер винды потребует разрешения для программы - соглашаемся) (картинка для упрощения восприятия)

Скрытый текст

freePIE-Opentrack.thumb.png.2567455e97ea

Открываем скрипт во FreePIE

  1. загружаем File >> Open
  2. запускаем Script >> Run

Пример скрипта использования кнопок джоя для максимальных смещений головы вправо/влево.

Скрытый текст

import socket
import struct
# номера устройств(джойстиков) начинаются с 0, вам надо найти свой или использовать названия(см. ниже)
x52 = joystick[2]
ed = joystick["EDTracker EDTracker2"] # выбираем по имени устройства
 
if starting:
    opentrack_UDPsender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    global yaw, pitch, roll, x, y, z
    x , y , z , yaw , pitch , roll  = 0,0,0,0,0,0
# преобразуем 1000 отсчётов в одну сторону в угловую величину для opentrack, знаком "-" инвертируем
yaw   =  ed.x*0.18 # 180/1000=0.18 180 градусов делим на 100 количество отсчётов устройства
pitch =  ed.y*0.18
roll  = -ed.z*0.18
# Номера кнопок начинаются с 0 (первая кнопка джоя), поэтому когда выбираете кнопки в утилите системы нужно вычитать еденицу
# Назначаем под свои нужды
if   x52.getDown(22): y =  1000
elif x52.getDown(20): y = -1000
else:                 y =  0
 
if   x52.getDown(21): x = -1000
elif x52.getDown(23): x =  1000
else:                 x =  0
# отсылка всех осей пакетом UDP на порт который слушает Opentrack
opentrack_UDPsender.sendto(struct.pack("dddddd",x,y,z,yaw,pitch,roll), ("127.0.0.1", 5555))
# для осылки в FaceTrackNoir нужно заменить на struct.pack("ddddddl",x,y,z,yaw,pitch,roll,1)
# выводим диагностику в окно Watch
diagnostics.watch(yaw)
diagnostics.watch(pitch)
diagnostics.watch(roll)
diagnostics.watch(x)
diagnostics.watch(y)
diagnostics.watch(z)

 

P.S. прошу модератора закрепить тему, это наболевший вопрос и Мечник просил создать тему, после моего ответа в одну из таких тем

P.P.S. прошу модератора дать возможность дополнять первый пост примерами/исправлениями

  • Вверх 4
medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я не понимаю, зачем придумывать велосипед? 
зачем импортировать в опентрак настройки из скрипта, если можно самому в опентраке настроить? 
 

и что за оси не работают при подключении опентрака? 

 

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

 

Изменено пользователем MajorAtkins
medal medal medal medal medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@MajorAtkins

Если у вас есть свой конфиг как получить смещения головы на кнопках при работающем Opentrack/FreeTrack/FTnoir, поделитесь.

Если нет, зачем писать в эту тему?

Изменено пользователем CutzMF
medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тема актуальна, я правда разрулил все только FTNoIR двумя источниками ввода. Камера и инерционник, и настройкой всех осей.

medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
14 минуты назад, vesvit сказал:

Тема актуальна, я правда разрулил все только FTNoIR двумя источниками ввода. Камера и инерционник, и настройкой всех осей.

@vesvit Я позже дополню.

я юзаю 3 варианта, один из них-  микс инерционного + point трекер (похожий на ваш вариант =), камера висит надо мной), чтобы получить полные 180 обороты по всем осям -  у меня есть не 3Dшный HMD 2560*1440

У меня были проблемы с FTnoir и двумя источниками ввода, поэтому я собрал другую схему.

Сейчас жду следующего релиза Opentrack - хочу поддержку python - и тогда границ не будет =)

Изменено пользователем CutzMF
medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
59 минут назад, CutzMF сказал:

@MajorAtkins

Если у вас есть свой конфиг как получить смещения головы на кнопках при работающем Opentrack/FreeTrack/FTnoir, поделитесь.

Если нет, зачем писать в эту тему?

ну может потому, что я могу ? 
и потому что у меня есть опентрек? :)
я хочу понять проблему, пока что мне не ясна.

 

 

я оставил активными оси - поворота горизонтально головы и вертикально
приближение поставил на хатку в игре. 

 

Изменено пользователем MajorAtkins
medal medal medal medal medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 минут назад, MajorAtkins сказал:

ну может потому, что я могу ? 
и потому что у меня есть опентрек? :)

вы флеймите - засоряете ветку

9 минут назад, MajorAtkins сказал:

я хочу понять проблему, пока что мне не ясна.

если у вас нет проблемы, тогда это точно флейм или троллинг

9 минут назад, MajorAtkins сказал:

я оставил активными оси - поворота горизонтально головы и вертикально
приближение поставил на хатку в игре. 

как ты смещаешь голову вправо/влево, вверх/вниз, вперёд/назад?

 

medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 часа назад, CutzMF сказал:

Частенько появляются темы о невозможности управления кнопками/осями джойстика смещениями головы при установленном OpenTrack

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

medal medal medal medal medal medal medal medal medal medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А можно сделать предложенными вами средствами так, чтобы при нажатии кнопки к значениям оси Y прибавлялось определенное значение? При этом оси не отключать.

 Хочется для стрельбы из под капота.

medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, _Legus_ сказал:

А можно сделать предложенными вами средствами так, чтобы при нажатии кнопки к значениям оси Y прибавлялось определенное значение? При этом оси не отключать.

 Хочется для стрельбы из под капота.

Можно! Какая у вас сейчас конфигурация обзора, программы, железки?

P.S. Я лично против заглядывания за капот и летаю без такой возможности

Изменено пользователем CutzMF
medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, sikir98 сказал:

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

Вы прочитали скрытый текст раздела "Вводная"?

Какой у вас трекер? Point, инерционник?

Изменено пользователем CutzMF
medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Т.е еслия  использую все шесть оси, то такой финт с ушами не прокатит?

medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, _Legus_ сказал:

Т.е еслия  использую все шесть оси, то такой финт с ушами не прокатит?

Всё будет работать. Скрипт я правда на коленке, без проверки накидал (только вечером смогу проверить)

У тебя будет чуток другая схема Opentrack >> FreePIE >> Warthunder

В opentrack надо настроить выходной интерфейс на UDP порт 4242 и запустить скрипт, возможно потребуется запустить FreePIE до запуска игры.

Скрытый текст

import socket
import struct
import select
x52 = joystick[2]

def open_socket(PORT):
    S = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    S.settimeout(1.0)
    S.setblocking(0)
    S.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    S.bind(('127.0.0.1',PORT))
    return S
  
if starting:
    POINT = open_socket(4242)
    x, y, z, yaw, pitch, roll = 0,0,0,0,0,0
    
if select.select([POINT], [], [], 0.01)[0]:
    data = POINT.recv(48)
    (x, y, z, yaw, pitch, roll) = struct.unpack("dddddd", data)

if x52.getDown(22) or keyboard.getKeyDown(Key.UpArrow): y = 75

freeTrack.yaw = yaw
freeTrack.pitch = pitch
freeTrack.roll = roll
freeTrack.x = x
freeTrack.y = y
freeTrack.z = z

 

Ну и конечно выбрать свой джойстик и кнопку или клавишу на клавиатуре - в скрипте это интуитивно понятно

Изменено пользователем CutzMF
medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
17 часов назад, CutzMF сказал:

 как ты смещаешь голову вправо/влево, вверх/вниз, вперёд/назад?

 

влево вправо\ вверх\вниз идет по опентреку.

вперед\назад ( я так понял зум\приближение) - кнопками на джойстике - в частности - хатка.
имел с этим проблему - в настройках игры убрал трекинг головы -вкл. на выкл.

если вам надо подробная информация, могу помощь  скриншотом. 

или можем списаться в игре. 
 

medal medal medal medal medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, MajorAtkins сказал:

влево вправо\ вверх\вниз идет по опентреку.

вперед\назад ( я так понял зум\приближение) - кнопками на джойстике - в частности - хатка.
имел с этим проблему - в настройках игры убрал трекинг головы -вкл. на выкл.

если вам надо подробная информация, могу помощь  скриншотом. 

или можем списаться в игре. 
 

Перечитайте вводную, если хотите разобраться зачем и кому может быть полезна эта тема. У вас, я понял, есть только повороты влево/вправо, вверх/вниз, кроме этого есть ещё повороты вдоль оси взгляда(roll), смешения вперёд/назад, влево/вправо, вверх/вниз, а приближение это игрва функция, которая никак не коррелирует с Freetrack протоколом.

Впредь прошу не флудить =)

Изменено пользователем CutzMF
  • Вверх 1
medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добрый день ! А с TrackiR эта программа работает ? Я пробовал  месяца два назад не получилось . 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, KBAKIN21 сказал:

Добрый день ! А с TrackiR эта программа работает ? Я пробовал  месяца два назад не получилось . 

Я не понял вас, раскройте подробнее свой вопрос.

FreePIE может оборачивать данные в протоколы TrackIR/FreeTrack и отдавать их в игру.

У меня тундра отлично работала по обоим протоколам из FreePIE

Изменено пользователем CutzMF
medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо!

Попробовал.  Помогли древние знания программирования. Реакция в игре есть, но жутко резкая, ловит десятые доли градуса движения   головы. На стрелку (поднятие головы) реагирует заметно. Где-то  наверно нужно  поправочные коэффициенты вводить. Как в вашем скрипте 0,18. А где и как, знаний увы уже не хватает.

medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 минут назад, _Legus_ сказал:

Спасибо!

Попробовал.  Помогли древние знания программирования. Реакция в игре есть, но жутко резкая, ловит десятые доли градуса движения   головы. На стрелку (поднятие головы) реагирует заметно. Где-то  наверно нужно  поправочные коэффициенты вводить. Как в вашем скрипте 0,18. А где и как, знаний увы уже не хватает.

Я понял куда закралась ошибка - повороты головы в протоколе в радианах, а не градусах

Добавьте перевод в радианы

Скрытый текст

p=3.1415926/180
freeTrack.yaw = yaw*p
freeTrack.pitch = pitch*p
freeTrack.roll = roll*p

 

 

Изменено пользователем CutzMF
medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С поворотом теперь все пучком. Пришлось инверсию еще сделать. А с движениями чувствительность нужно сильно поднять. Где то опять коэффициент вкрался. 

P.s. FreePie передает данные без искажений, или есть какие то ползунки?

medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не удобно. После перезапуска скрипта приходится игру перезапускать. (((

medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, CutzMF сказал:

Перечитайте вводную, если хотите разобраться зачем и кому может быть полезна эта тема. У вас, я понял, есть только повороты влево/вправо, вверх/вниз, кроме этого есть ещё повороты вдоль оси взгляда(roll), смешения вперёд/назад, влево/вправо, вверх/вниз, а приближение это игрва функция, которая никак не коррелирует с Freetrack протоколом.

Впредь прошу не флудить =)

да что с вами такое? какой флуд? что за предвзятое отношение? 

приближение можно настраивать в опентраке, а можно настривает в клиенте игры, ось Z или X, если я не ошибаюсь( конечно я использую 6 осей ) 

причем все, что не нужно я убрал на 0. потому и не имею проблем.


 кстати - OpenTrack устанавливали или используете Portable ? 

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

 

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

 

 

Не удобно. После перезапуска скрипта приходится игру перезапускать. (((

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

 

Изменено пользователем MajorAtkins
medal medal medal medal medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Просто FreePie выгружает протокол после остановки скрипта, а OpenTrack нет. Наверно.

medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Заработало так:
 

Скрытый текст

import socket
import struct
import select
x52 = joystick[1]
p=3.1415926/180


def open_socket(PORT):
    S = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    S.settimeout(1.0)
    S.setblocking(0)
    S.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    S.bind(('192.168.1.32',PORT))
    return S
  
if starting:
    POINT = open_socket(4242)
    x, y, z, yaw, pitch, roll = 0,0,0,0,0,0
    
if select.select([POINT], [], [], 0.01)[0]:
    data = POINT.recv(48)
    (x, y, z, yaw, pitch, roll) = struct.unpack("dddddd", data)

if x52.getDown(22) or keyboard.getKeyDown(Key.UpArrow): y = 50


freeTrack.yaw = -yaw*p
freeTrack.pitch = -pitch*p
freeTrack.roll = roll*p
freeTrack.x = x*10
freeTrack.y = y*10
freeTrack.z = z*10

После перезапуска скрипта нужно полностью перезагружать игру...

medal

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу