А в этом Локоне прицел приближается или вся картинка укрупняется как в ИЛе? Вот в ИЛе к прицелу льнут не понастоящему.
Сам только ИЛ юзаю...:)
Вид для печати
А в этом Локоне прицел приближается или вся картинка укрупняется как в ИЛе? Вот в ИЛе к прицелу льнут не понастоящему.
Сам только ИЛ юзаю...:)
Так же, вся картинка приближается!
Может в релизе изменится что-то :)
Кстати здесь даже тема есть по поводу приближения.
Позволю разок себе повториться, уже в своей (нашей) ветке:
"Все перевернул с ног на голову, теперь будет 4 передатчика и один приемник. Влияние засветки устранил (почти) полностью - лампа в 100Вт с расстояния 500мм практически не влияет на результат!
Схема получилась не сложнее , чем двухканальная (сейчас 4 канала, легко можно довести до 6 каналов, практически без усложнения схемы!). Появился небольшой дергунец во всех каналах, сейчас это главная проблема, все еще не понял, в чем дело, похоже в том, что излучающие ИК светодиоды включаются недостаточно быстро... или наводки... (на осциллографе мне показалось, что помехи похожи на кадровые импульсы TV...) будем думать дальше! Программа еще не готова, но уже обнадеживает, благодаря 4 каналам, уже осуществляется усреднение измерений, благодаря чему, дергунец уменьшается в 2 раза (усе равно, что добавляется один бит в ADC!) Частота измерений меняется от 10/сек до 60..100/сек, в зависимости от расстояния от излучателей до приемника. Здесь, похоже, лучше применить AVR контороллер с встроенным ADC, но для задачи управления обзором и частоты 10/сек вполне достаточно (имхо)."
Это я написал неделю назад, в соседней ветке. Теперь текущие сводки с фронта:
В процессе доводки железа полностью подтвердилась (ранее только подозреваемая) сильная анизотропия излучающего светодиода (применялся импортный СД синюшного цвета, диаметром 5мм, якобы, для пультов ДУ). ДН (диаграмма направленности) в плоскости ножек СД (светодиода) и в плоскости, нормальной к ножкам, и в плоскости под углом в PI/4, сильно отличаются друг от друга! Причем, последняя ДН, которая "в плоскости под углом в PI/4", не является промежуточной, а является еще более острой, чем первые две! Отсюда следует вывод, что в ДН СД есть не менее 4х лепестков! (И еще один вывод - неудачи в применении оптики в джоестроении могут быть связаны и с этим тоже!)
Исследование ранее применявшихся мною СД АЛ164 (с плоской матовой излучающей поверхностью) показало еще более неравномерную ДН (два огромных боковых лепестка и один плоский центральный), кроме того, у них более низкий КПД, все это исключает возможность применения отечественных СД (с плокой матовой излучающей поверхностью), а как бы хотелось поддержать отечественного производителя!
За последние несколько дней, я наконец, собрал установку для снятия ДН СД. Вчера и сегодня только этим и занимаюсь. Похоже, что при учете неравномерности ДН СД, все-таки возможно использование СД (но только не с плоской излучающей поверхностью!).
Хватит про оптику, пора про электронику! Как я писал неделю назад, "Появился небольшой дергунец во всех каналах". Так вот, я его наконец победил! Дергается код АЦП только в 3м-4м знаке! Посто я немного лоханулся и неправильно рассчитал фильтры. В последнем варианте их три: первый ФНЧ (Q~5, Fr~3kHz), второй ФВЧ(Q~1.5,Fr~3.6kHz) (основная фильтрация от бытовых источников света), а третий - довольно странный, у него везде коеффициент передачи не меньше единицы, но на 3kHz огромный горб около 20дБ (или даже больше, на память не скажу). И кроме того, я поменял в АЦП простейшее токовое зеркало на токовое зеркало Уильсона, но это мало на что повлияло (может быть, на температурную стабильность, ессно, в лучшую сторону).
В результате доработок "дергунец" практичеки исчез, но снизилась частота опроса до (6...7Hz-40...85Hz) "в зависимости от расстояния от излучателей до приемника":D.
"Будем думать дальше!";)
GO!
Как метод борьбы с анизотропией излучателей. Может приемник на голове делать, а не излучатель.
Как там с ДН приемников дело обстаит?
приемник мне видиься из четырех фд, расположенных рядом и оси корорых образуют ребра пирамидки, сходятся в вершине. Диоды глядат в сторону основания пирамидки, в стороны одним словом.
Нет, так не очень. Поначалу рассматривал вариант с четырьмя фотоприемниками, но оказалось выгоднее 4 передатчика и один приемник (передатчики излучают не одновременно, а по очереди). Дело в том, что после приемника стоят аналоговые фильтры, сейчас - целых 3 каскада. Они фильтруют постоянную засветку и мерцающую - солнечный свет и люминесцентные лампы и т.п. А передатчик - это всего лишь СД управляемый ключом, ну и еще источник тока - один на все 4 канала. Последний вариант получается гораздо проще, кроме того, легче достичь идентичности каналов, влияет только разброс характеристик СД, а не всей аналоговой части с фильтрами - она общая для всех каналов.
ДН светодиодов уже снял. Сейчас она у меня ввиде трех таблиц: по вертикали, по горизонтали и по диагонали (от плоскости выводов). Сейчас пишу вспомагательную прогу, с помощью которой я найду необходимую функцию для преобразования ДН в форму равнобедренного треугольника. Дальше - просто. Алгоритм примерно как у частотного детектора в ЧМ приемнике (сложение-вычитание).
Хочется разубедить всех безоговорочно жадущих вывода данных сего девайса на оси джоя.
Если это нужно для управления чем-то как джоем, то очень омневаюсь что это будет юзабельно.
Если это для взаимодействия с NewView, то это операция на глаз через задний проход!
NewView опрашивает джой для получения абсолютных координат и передачи их после обработки Илу. Но ему совершенно не важно откуда брать эти самые координаты. Более того, опрос джоя это не самое точное и быстрое решение. Гораздо проще спрашивать эти данные у той, программы, что уже написана и пихать их Илу. Именно так работает TrackEM от Alezz'a. Это я к тому что открытый интерфейс для подобных программ и железяк уже реализован в NewView! Нет необходимости городить огород с осями джоя для обзора. Вот.
А что если также коммутировать принимающие диоды через какинть поливики? или помехи вносятся?Цитата:
Originally posted by GO!
А передатчик - это всего лишь СД управляемый ключом, ну и еще источник тока - один на все 4 канала.
Ты подумай, сколько энто будет стоить! И что это дает! Есть хорошая микруха КР1109КТ22 (7 ключей в DIP16 корпусе!)(аналог ULN2003A), и куча других микрух - токовых ключей, которые стоят копейки и полностью удовлетворяют... разработчика. :)Цитата:
А что если также коммутировать принимающие диоды через какинть поливики? или помехи вносятся?
2 Hruks
Не... Это всего-лишь один из вариантов устройства управления обзором. NewView - вещь! Но - хочу большего, потому и не бросил! TrackIR в целом, по России, купить почти нереально (даже в Самаре!) (и дороговато).Цитата:
Если это для взаимодействия с NewView, то это операция на глаз через задний проход!
Похоже, намечается хорошая альтернатива TrackIR в виде известной проги CAM2PAN. Но и она не лишена недостатков. Хотелось бы там увидеть поддержку не только веб-камер, но и камер, подключенных к компу через платы видеозахвата, TVтюнеры и т.п.
Посему, поскольку, как заметил гн. Pioneerrr "...копать следует во всех направлениях...", я все еще продолжаю свою разработку.
Надо отметить, что в новом варианте с 4-мя передатчиками уже есть четкая привязка к центру, с небольшой мертвой зоной, которая регулируется поворотом одного подстроечного резистрора (порог приемника).
Аппаратная часть решена полностью, остались вопросы с излучателями и с программой.
Не-а! Именно так! С пассивным отражателем уровень сигнала меняется именно в 4-й степени! И невозможно его исправить или ухудшить применением отражателей хитрой формы.Цитата:
Но про ЧЕТВЕРТУЮ степень...
Всеже квадрат расстояния, кажется. Удваивается значение, а не степень... Ведь меняется скорость. А она, вроде, на уровень сигнала не влияет (доплеровщина не в счет!).
С природой не поспоришь!
Показываю скриншот индикатора проги. Здесь я пытался начертить крест и обвести крайнюю рамку. Головой, не мышкой! :)
Зеленое перекрестие показывает текущии координаты курсора.
Пока еще не ввел мертвую зону и регулировку кривой отклика. Так же есть проблемы по управлению параметрами мышки. Об этом ниже.
Проблема в следующем.
Вопрос программистам: Как программно регулировать чувствительность (не ускорение) мышки?
Из MSDN выходит, что так:
На самом деле, правильно выполняется только считывание текущей чувствительности, а запись (2й вызов SystemParametersInfo()) возвращает erc=false, в последней строке ищу код ошибки, а ercc=0. Проверял в Win98 и WinXP, результат - один.Код:var
Speed: Integer; // от 1 до 20, по умолчанию 10.
erc: longbool;
ercc: cardinal;
//.......
//.......
procedure TForm1.SpeedChange;
begin
erc:=SystemParametersInfo(SPI_GETMOUSESPEED, 0, @Speed, 0);
Speed:=1; // Установить sensitivity=1
erc:=SystemParametersInfo(SPI_SETMOUSESPEED, 0, @Speed, SPIF_SENDCHANGE or SPIF_UPDATEINIFILE);
ercc:=GetLastError;
end;
Вызов той же функции для регулировки ускорения мышки работает в обе стороны и чтение (SPI_GETMOUSE) и запись (SPI_SETMOUSE). Я в непонятках, что здесь не правильно? Есть ли другие программные способы регулирования чувствительности мышки?
Выходит, что никто не знает!
Обращаюсь еще раз конкретно к UIV, Maxix, Hruks&Alezz (а также и к остальным, кто знаком с функциями API)
Как программно регулировать чувствительность (не ускорение) мышки? итд, итп...
Справлюсь, конечно, и без этого, но так мышка будет двигаться плавнее, и мне не придется отслеживать изменение разрешения дисплея.
Точно знаю, что это сделать можно, и вот почему:
Существует такая прога "XPmousespeed", когда ее запускаешь, в заголовке диалогового окна "XPмышегон". Работает и в Win98 и в WinXP. FreeWare. Она написана кем-то с сайта команды по каунтстрайк М19. Но и в сайте и в проге нет ни одного мыла для связи. Кроме того, эта прога выложена на сайте одного из лицеев Нижнего Новгорода. Может быть, кто-нибудь знаком с этой прогой или знает, как связаться с ее автором?
Лазая по 'XPMouseSpeed.exe' (118784байт 29.12.2002), я обнаружил, что прога написана на Visual C и тоже использует функцию API SystemParametersInfo().
Если так, то быть может, стоит поменять не разработчика, а версию Дельфи?! :D (сейчас у меня Delphi interprise version 5.0(build 5.62)).
Или попробовать на Visual C? Хотя я в нем не особеннно силен :( . Будем думать дальше! :D
При использовании SPI_SETMOUSESPEED нужно передавать третьим параметром не адрес переменной, а её значение (или константу), приведённое к типу указателя. То есть, в Вашем случае должно быть примерно следующее:Цитата:
Originally posted by GO!
Проблема в следующем.
Вопрос программистам: Как программно регулировать чувствительность (не ускорение) мышки?
Из MSDN выходит, что так:
[...]Код:var
Speed: Integer; // от 1 до 20, по умолчанию 10.
erc: longbool;
ercc: cardinal;
//.......
//.......
procedure TForm1.SpeedChange;
begin
erc:=SystemParametersInfo(SPI_GETMOUSESPEED, 0, @Speed, 0);
Speed:=1; // Установить sensitivity=1
erc:=SystemParametersInfo(SPI_SETMOUSESPEED, 0, @Speed, SPIF_SENDCHANGE or SPIF_UPDATEINIFILE);
ercc:=GetLastError;
end;
В четвёртом параметре SPIF_UPDATEINIFILE добавлять не надо, так как SPIF_SENDCHANGE делает всё, что нужно:Код:erc:=SystemParametersInfo(SPI_SETMOUSESPEED, 0, Pointer(Speed), SPIF_SENDCHANGE);
Проверено - работает.Цитата:
SPIF_SENDCHANGE Broadcasts the WM_SETTINGCHANGE message after updating the user profile.
Цитата:
Originally posted by Mishel
При использовании SPI_SETMOUSESPEED нужно передавать третьим параметром не адрес переменной, а её значение (или константу), приведённое к типу указателя. То есть, в Вашем случае должно быть примерно следующее:
В четвёртом параметре SPIF_UPDATEINIFILE добавлять не надо, так как SPIF_SENDCHANGE делает всё, что нужно:Код:erc:=SystemParametersInfo(SPI_SETMOUSESPEED, 0, Pointer(Speed), SPIF_SENDCHANGE);
Проверено - работает.
Спасибо, заработало! :)Цитата:
Originally posted by Mishel
При использовании SPI_SETMOUSESPEED нужно передавать третьим параметром не адрес переменной, а её значение (или константу), приведённое к типу указателя. То есть, в Вашем случае должно быть примерно следующее:
В четвёртом параметре SPIF_UPDATEINIFILE добавлять не надо, так как SPIF_SENDCHANGE делает всё, что нужно:Код:erc:=SystemParametersInfo(SPI_SETMOUSESPEED, 0, Pointer(Speed), SPIF_SENDCHANGE);
Проверено - работает.
Обьясняется имхо немного по другому:
@Speed - адрес Speed - константа
Pointer(Speed) - указатель, установленный на адрес Speed - переменная
Не совсем понятно почему работает SPI_SETMOUSE так как у меня и по указателю тоже:
Я думаю, что это как-то связано с тем чтоКод:type
paMouse= ^aMouse;
aMouse = array [1..3] of integer;
var
Speed : Integer;
aM : aMouse;
paM : paMouse;
erc : longbool;
//.............................
paM:=@am;
am[1]:=0; //Отключить ускорение
am[2]:=0;
am[3]:=0;
erc:=SystemParametersInfo(SPI_SETMOUSE, 0, @aM, SPIF_SENDCHANGE); //работает :)
erc:=SystemParametersInfo(SPI_SETMOUSE, 0, paM, SPIF_SENDCHANGE); //работает :)
Speed:=1; //Установить чувствительность=1
erc:=SystemParametersInfoW(SPI_SETMOUSESPEED, 0, Pointer(Speed),SPIF_SENDCHANGE); //работает :)
erc:=SystemParametersInfoW(SPI_SETMOUSESPEED, 0, @Speed, SPIF_SENDCHANGE); //не работает :(
sizeof(aM){=12} > sizeof(Speed){=4}
при передаче параметров с размером, большим 4 байт, передается не параметр, а указатель на него.
Но ведь sizeof(@Speed) = sizeof(Pointer(Speed)) = sizeof(@aM) = sizeof(paM) = 4
...А при приеме SPI_GETMOUSE и SPI_GETMOUSESPEED работают наоборот только @aM и @Speed ...
Как то туманно все это. Но главное - результат достигнут. Еще раз спасибо! :)
2 GO!
Попробую прояснить ситуацию.
Не важно (в данном случае), константу Вы пытаетесь передать или переменную. Для компилятора важен тип передаваемого параметра, а для кода вызывыемой функции - значение. В обоих случаях тип передаваемого параметра - Pointer (т.е. - компилятор удовлетворён), а вот значение - в первом случае - это адрес переменной Speed, а во втором - значение переменной Speed. Так как вызываемая функция проверяет диапазон допустимых значений данного параметра (1..20), а адрес переменной Speed не входит в этот диапазон, функция возвращает false (в первом случае).Цитата:
Originally posted by GO!
Обьясняется имхо немного по другому:
@Speed - адрес Speed - константа
Pointer(Speed) - указатель, установленный на адрес Speed - переменная
Здесь в первых двух вызовах передаётся указатель: @aM - нетипизированный (Pointer), paM - типизированный. И тот и другой совместимы по типу с Pointer и указывают на один и тот же массив.Цитата:
Не совсем понятно почему работает SPI_SETMOUSE так как у меня и по указателю тоже:
Код:type
paMouse= ^aMouse;
aMouse = array [1..3] of integer;
var
Speed : Integer;
aM : aMouse;
paM : paMouse;
erc : longbool;
//.............................
paM:=@am;
am[1]:=0; //Отключить ускорение
am[2]:=0;
am[3]:=0;
erc:=SystemParametersInfo(SPI_SETMOUSE, 0, @aM, SPIF_SENDCHANGE); //работает :)
erc:=SystemParametersInfo(SPI_SETMOUSE, 0, paM, SPIF_SENDCHANGE); //работает :)
Speed:=1; //Установить чувствительность=1
erc:=SystemParametersInfoW(SPI_SETMOUSESPEED, 0, Pointer(Speed),SPIF_SENDCHANGE); //работает :)
erc:=SystemParametersInfoW(SPI_SETMOUSESPEED, 0, @Speed, SPIF_SENDCHANGE); //не работает :(
В третьем вызове передаётся значение Speed (=1) (значение типа Integer приведено к типу Pointer, но по прежнему является значением, а не адресом переменной Speed), в четвёртом вызове передаётся адрес Speed (явно вне диапазона 1..20).
Всё гораздо проще.Цитата:
Я думаю, что это как-то связано с тем что
sizeof(aM){=12} > sizeof(Speed){=4}
при передаче параметров с размером, большим 4 байт, передается не параметр, а указатель на него.
Но ведь sizeof(@Speed) = sizeof(Pointer(Speed)) = sizeof(@aM) = sizeof(paM) = 4
...А при приеме SPI_GETMOUSE и SPI_GETMOUSESPEED работают наоборот только @aM и @Speed ...
Как то туманно все это. [...]
Функцией ожидается в третьем параметре:
в случае SPI_GETMOUSE и SPI_SETMOUSE - указатель на массив из трёх Integer'ов;
в случае SPI_GETMOUSESPEED - указатель на переменную типа Integer;
в случае SPI_SETMOUSESPEED - значение типа Integer.
Цитата:
Всё гораздо проще.
Функцией ожидается в третьем параметре:
в случае SPI_GETMOUSE и SPI_SETMOUSE - указатель на массив из трёх Integer'ов;
в случае SPI_GETMOUSESPEED - указатель на переменную типа Integer;
в случае SPI_SETMOUSESPEED - значение типа Integer.
Mishel, Ты просто молодец! Ты меня спас! Будешь в Самаре - с меня пиво! (приглашаю в гости!).Цитата:
Всё гораздо проще.
Функцией ожидается в третьем параметре:
в случае SPI_GETMOUSE и SPI_SETMOUSE - указатель на массив из трёх Integer'ов;
в случае SPI_GETMOUSESPEED - указатель на переменную типа Integer;
в случае SPI_SETMOUSESPEED - значение типа Integer.
А не знаешь ли как временно заблокировать (а потом разблокировать) перемещение реальной мышки(мышек), при
этом, желательно, оставить в действии их кнопки и кнопки клавы тоже?
Никогда не озадачивался такой проблемой.Цитата:
Originally posted by GO!
[...]
А не знаешь ли как временно заблокировать (а потом разблокировать) перемещение реальной мышки(мышек), при
этом, желательно, оставить в действии их кнопки и кнопки клавы тоже?
Чтобы заблокировать именно изменение координат мыши, не затронув её кнопки и клаву, из штатных системных средств можно попробовать два варианта. Но надежды на их эффективность немного, так как оба они работают с экранными координатами мышиного курсора, и в игре это может не сработать.
1. Воспользоваться функцией ClipCursor(lpRect: PRect): BOOL;, передав ей прямоугольник, в котором левый верхний угол соответствует текущим координатам курсора, а правый нижний - на один пиксель правее и ниже. При этом виндузный курсор мыши не сдвинется ни на один пиксель. Чтобы вернуть обычное состояние - нужно передать в эту функцию nil.
2. Написать hook-функцию для мыши (WH_MOUSE), которая будет фильтровать мышиные события до того, как они достигнут приложения. Подробнее о работе с хуками - в MSDN.
Оба эти варианта под вопросом.
Что может действительно помочь - это написание драйвера-фильтра для этой цели (может уже кто-то написал такой).
PS: Спасибо за приглашение на пиво :).
В ИД2Ш и в ИЛ2ЗС в файле CONF.INI есть такие строчки:
Если заменить последнее значение на mouseUse=1, то в игре уже будет использоваться не собственный курсор мыши, а системный.Код:[rts]
;ProcessAffinityMask=1
mouseUse=2
При этом начинают правильно работать функции GetCursorPos,SetCursorPos и Mouse_Event с параметром (MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE).
Это полностью устраняет "проскальзывание мыши" и упрощает связь управляющей проги с ИЛом. Вот соответствующий трек (для ИЛ2ЗС v1.0):
В ИД2Ш и в ИЛ2ЗС в файле CONF.INI есть такие строчки:
Если заменить последнее значение на mouseUse=1, то в игре уже будет использоваться не собственный курсор мыши, а системный.Код:[rts]
;ProcessAffinityMask=1
mouseUse=2
При этом начинают правильно работать функции GetCursorPos,SetCursorPos и Mouse_Event с параметром (MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE).
Это полностью устраняет "проскальзывание мыши" и упрощает связь управляющей проги с ИЛом. Вот соответствующий трек (для ИЛ2ЗС v1.0):
Тогда уж лучше в ntrk запиши. В 1.0 щас уже никто не летает.Цитата:
Originally posted by GO!
Вот соответствующий трек (для ИЛ2ЗС v1.0):
Еще один плюс - прога работает теперь и в Win98.
Вот тот же трек, переписанный в NTRK (архив в двух томах):