PDA

Просмотр полной версии : Взгляд со стороны на Point of View, или немного о хатках.



Alex Oz
08.07.2013, 02:34
Таки взглянем на хатку. Пристально. Внимательно. На первый взгляд - грибок, четыре кнопки, восемь позиций.
Это - обычно-привычная хатка, все производители игр/симуляторов только так её и видят.
Производители джойстиков только так её и делают, ибо игры/симы по другому её и не представляют.
Теперь посмотрим в структуру DIJOYSTATE, из которой собственно практически все игры и берут данные от контроллеров джойстиков:


typedef struct DIJOYSTATE {
LONG lX; /* x-axis position */
LONG lY; /* y-axis position */
LONG lZ; /* z-axis position */
LONG lRx; /* x-axis rotation */
LONG lRy; /* y-axis rotation */
LONG lRz; /* z-axis rotation */
LONG rglSlider[2]; /* extra axes positions */
DWORD rgdwPOV[4]; /* POV directions */
BYTE rgbButtons[32]; /* 32 buttons */
} DIJOYSTATE, *LPDIJOYSTATE;

В DIJOYSTATE2 ( DX8 ) собственно больше кнопок и дополнительных осей, но нам сейчас это неинтересно.
Интересно больше что rgdwPOV - это DWORD и никак не три бита.
Формально любой контроллер обьявляет хатку как аналоговое (не дискретное!) устройство с диапазоном 360°, но сужает её дискретность до 3 бит. Игры в конечном итоге из директинпута получают значения от 0 до 36000 - и ничего не знают о изначальной дискретности хатки.
Самое интересное начинается дальше.После ввода значений хатки игра/сим делит полученное значение из DX на 4500 - и получает наши знакомые три бита и восемь положений. Потом игра, получив эти данные, преобразует их в восемь кнопок, которые затем уже мапятся на обзор. Логично? Мне кажется не совсем. Это просто костыль для поддержки четырехкнопочных хаток - иных не было.

Но, ещё более интересно, что соответсвующий апплет Windows XP - вполне нормально понимает хатки с числом позиций больше 8( правда больше 315° не видит - ну не было таких устройств для теста тогда). Если позволить игре сразу, минуя дополнительные преобразования принять данные и установить "поинт оф вью" согласно того что выдала хатка - получим и совместимость с 8-ми позиционными хатками, и с аналоговыми.

Ради интереса создал хатку на 8 бит ( 240°, дискретность 1,5°) - винда отлично её понимает, директ инпут вполне успешно выдает эти данные.
И текущий DX позволяет их иметь в девайсе аж 4 штуки. И все полностью аналоговые. Что это означает на практике? Что уже больше десятка лет существуют дополнительных 4 аналоговых оси в любом контроллере - просто ими никто не пользуется. Не пользуется во-первых - потому что до сего дня не существовало таких устройств, которые давали бы такую возможность, а во-вторых - не существует игр/симов, которые позволяли бы эту возможность использовать. Замкнутый круг. Приблизительно такая же ситуация была когда я попробовал первую вибронакидку - но тогда благодаря недоразумению Ил2Ш позволил получить вибрацию на "левое" устройство.

После перехода на DX8 игровые устройтсва получили три дополнительных оси (5+3 , +60% ).Это была революция своего рода. Однако возможность использования структур POV как аналоговых - это означает испоьзования 8+4 ( +50% ) =12 осей уже сегодня с одного контроллера.И эта латентная "революция" лежит тихохонько и ждет своего часа.
Все что надо - просто воспользоваться этим. По сравнению с раскраской и расчетом баллистической траектории пульки в любом симе - это 0,0000....1 % кода обсчета этой пульки и максимум полчаса работы с перерывом на кофе/пиво.

В результате запросто можно получить полноценный 3D обзор с микростика ( при этом оставить 8 осей на управление) , или если есть трекер - 4 дополнительных оси на управление - будь то радиатор, закрылки или еще чего - конечно мелочишка в современном симе, а приятно...


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


Приложения
168760168761168762

http://www.youtube.com/watch?v=lJYi12KRLnk&feature=youtu.be


PS в тестовом конфиге - хатки POV2 и POV3 "привязаны" к основным осям XY - для наглядности, POV1 - обычная 8-ми позиционная хатка.

Pavel_Kh
08.07.2013, 08:49
Ну что сказать...супер!!! Очень интересно.
Первый вопрос который приходит в голову - триммирование этим способом осей крена и тангажа можно осуществить?

Alex Oz
08.07.2013, 11:38
Хатко-оси можно цеплять в симе - точно также, как и обычные - хоть на триммеры, хоть куда. Единственное "ограничение", связанное с совместимостью с нынешними "дискретными" хатками - это 36000 отсчетов оси, а не 65536 как для обычных. Впрочем ограничеие весьма условное, потому как и такое разрешение выше любых потенциально требуемых разрешений для устройств в 4000 отсчетов. В симе добавить строчку, где будет нормировка в зависимости от типа оси - гораздо проще и быстрее, чем сейчас всё это было описать здесь.

mega_mozg_13
08.07.2013, 11:44
И текущий DX позволяет их иметь в девайсе аж 4 штуки.

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

Alex Oz
08.07.2013, 12:11
Да пожалуйста, секрета в этом никакого нет:

HID_UsagePage(HID_USAGE_PAGE_GENERIC_DESKTOP),
HID_Usage(HID_USAGE_GENERIC_HATSWITCH),
HID_LogicalMin(0),
HID_PhysicalMin(0),
HID_LogicalMaxS(POV_MAX-1),
HID_PhysicalMaxS(315),
HID_Unit(0x14),
HID_ReportSize(8),
HID_ReportCount(1),
HID_Input(HID_Data | HID_Variable | HID_Absolute | HID_NullState)

Здесь однобайтовая хатка , при POV_MAX=8 - 8 ми позиционная, при POV_MAX=240 - аналоговая с шагом 1,5° (соответственно надо скорректировать HID_PhysicalMaxS(360), 0xFF - в обоих случаях считается нейтральным положением.
А по числу хаток дальше возможны варианты: 4 раза повторяем эту структуру либо повторяем в ней HID_Usage(HID_USAGE_GENERIC_HATSWITCH) - еще три раза и сотвественно тогда HID_ReportCount(4). Первый вариант больше подходит для динамического формирования HID-репорта, второй - для статического задания.
В NJoy32 используется динамический способ, который позволяет задать количество указателей POV (0-4) самим пользователем в три клика мышки.
Разумеется можно задать размер данных и не один, а два байта , и получить не 240 отсчетов, а вплоть до 36000 - но пока это можно только увидеть в тестовой программе.

Минимумы в принципе можно и не обьявлять, если ранее были заданы нули.

mega_mozg_13
08.07.2013, 12:19
хм, вот оно как!!!
просто все остальные параметры объявляются с привязкой типа "это ось такая-то" или "кнопка номер N", а тут просто подряд от 1й до 4й хаток.
будет чем заняться и прикрутить вагон хаток к старику мджою...
Спасибо.

Alex Oz
08.07.2013, 12:23
Да, все просто, пожалуйста, пользуйтесь на здоровье :)

Один ньюанс - первая хатка это крайняя объявленная, если правильно помню...

Pavel_Kh
09.07.2013, 08:52
Алекс, мне кажется что есть смысл создать тему о твоем NJoy32.
По крайней мере есть смысл рассказать о тех возможностях которые дает его настройка.
Популярезировать надо контроллеры которые позволяют пользователям производить тонкие настройки под себя.
Большинство пользователей просто тупо назначают кнопки и оси в самой игре, даже не подозревая о тех возможностях которые им предоставляет этот контроллер.
Последнее относится не только к NJoy32 но и к большинству других контроллеров.

Alex Oz
09.07.2013, 11:11
О не, только не это :) Я популяризацию не потяну и не переживу - хочется успеть еще чего-то сделать - контроллер в нынешнем состоянии это только половина всех задумок.А потомки (надеюсь благодарные) со временем разберутся, чего там наворочено, и понапишут красивые и понятные мануалы.
Ну а кто разобрался и пользуется уже сейчас - надеюсь не сильно ругаются в мою сторону :)

Pavel_Kh
09.07.2013, 11:41
А кто Алекс лучше тебя знает что там можно сделать?
Я ж не говорю что бы ты писал трехтомную монографию с иллюстрацими! :)
Ты "на пальцах" покажи что он может, а дальше глядишь народ подтянется и этот топик и станет таким мануалом при соответствующем желании...
Тут главное "ввязаться в драку"! :)
Начни - там видно будет, опиши просто что уже реализовано, без особых подробностей, только о том что уже возможно и отработано...

mega_mozg_13
09.07.2013, 16:45
Тут главное "ввязаться в драку"!
как говорится, инициатива - наказуема =)
электроника есть под рукой? начинайте писать, а автор уже подправит ньюансы.
мне вот очень тяжело писать мануал, сам спинным мозгом понимаешь как всё работает а как это словами расписать, да чтобы понятно было.
основная задача это отделить что нужно рассказывать конечному пользователю, а что нет.

Pavel_Kh
09.07.2013, 23:48
как говорится, инициатива - наказуема =)
электроника есть под рукой? начинайте писать, а автор уже подправит ньюансы.
мне вот очень тяжело писать мануал, сам спинным мозгом понимаешь как всё работает а как это словами расписать, да чтобы понятно было.
основная задача это отделить что нужно рассказывать конечному пользователю, а что нет.

Под рукой есть, но не моя.
Так что я это все даже попробовать толком не могу.
Да и времени нет...к сожалению.

UIV
10.07.2013, 03:53
Под рукой есть, но не моя.
Так что я это все даже попробовать толком не могу.
Да и времени нет...к сожалению.
Ага, а у Алекса время есть?

- - - Добавлено - - -

Это трата времени, писатт мануалы, когда в проекте реализовано только половина задуманных функций. Изменение функционала = правки мануала. По времени это может быть в разы больше, чем непосредственное программирование.