А в этом Локоне прицел приближается или вся картинка укрупняется как в ИЛе? Вот в ИЛе к прицелу льнут не понастоящему.
Сам только ИЛ юзаю...![]()
А в этом Локоне прицел приближается или вся картинка укрупняется как в ИЛе? Вот в ИЛе к прицелу льнут не понастоящему.
Сам только ИЛ юзаю...![]()
Во-о-о как бывает...
Так же, вся картинка приближается!
Может в релизе изменится что-то
Кстати здесь даже тема есть по поводу приближения.
Крайний раз редактировалось Spasatel; 17.11.2003 в 16:51.
Желаете оказаться в центре боевых действий? Вам сюда! http://www.wwiionline.ru
Позволю разок себе повториться, уже в своей (нашей) ветке:
"Все перевернул с ног на голову, теперь будет 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) "в зависимости от расстояния от излучателей до приемника".
"Будем думать дальше!"![]()
Успехов!
GO!
Как метод борьбы с анизотропией излучателей. Может приемник на голове делать, а не излучатель.
Как там с ДН приемников дело обстаит?
приемник мне видиься из четырех фд, расположенных рядом и оси корорых образуют ребра пирамидки, сходятся в вершине. Диоды глядат в сторону основания пирамидки, в стороны одним словом.
Крайний раз редактировалось Pioneerrr; 28.01.2004 в 06:04.
Нет, так не очень. Поначалу рассматривал вариант с четырьмя фотоприемниками, но оказалось выгоднее 4 передатчика и один приемник (передатчики излучают не одновременно, а по очереди). Дело в том, что после приемника стоят аналоговые фильтры, сейчас - целых 3 каскада. Они фильтруют постоянную засветку и мерцающую - солнечный свет и люминесцентные лампы и т.п. А передатчик - это всего лишь СД управляемый ключом, ну и еще источник тока - один на все 4 канала. Последний вариант получается гораздо проще, кроме того, легче достичь идентичности каналов, влияет только разброс характеристик СД, а не всей аналоговой части с фильтрами - она общая для всех каналов.
ДН светодиодов уже снял. Сейчас она у меня ввиде трех таблиц: по вертикали, по горизонтали и по диагонали (от плоскости выводов). Сейчас пишу вспомагательную прогу, с помощью которой я найду необходимую функцию для преобразования ДН в форму равнобедренного треугольника. Дальше - просто. Алгоритм примерно как у частотного детектора в ЧМ приемнике (сложение-вычитание).
Успехов!
Хочется разубедить всех безоговорочно жадущих вывода данных сего девайса на оси джоя.
Если это нужно для управления чем-то как джоем, то очень омневаюсь что это будет юзабельно.
Если это для взаимодействия с NewView, то это операция на глаз через задний проход!
NewView опрашивает джой для получения абсолютных координат и передачи их после обработки Илу. Но ему совершенно не важно откуда брать эти самые координаты. Более того, опрос джоя это не самое точное и быстрое решение. Гораздо проще спрашивать эти данные у той, программы, что уже написана и пихать их Илу. Именно так работает TrackEM от Alezz'a. Это я к тому что открытый интерфейс для подобных программ и железяк уже реализован в NewView! Нет необходимости городить огород с осями джоя для обзора. Вот.
Вопросы по NewView задавать здесь: www.hruks.com/forum
NewView можно скачать здесь: www.newview.hruks.com
А что если также коммутировать принимающие диоды через какинть поливики? или помехи вносятся?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().
Если так, то быть может, стоит поменять не разработчика, а версию Дельфи?!(сейчас у меня Delphi interprise version 5.0(build 5.62)).
Или попробовать на Visual C? Хотя я в нем не особеннно силен. Будем думать дальше!
![]()
Успехов!
При использовании 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.
Крайний раз редактировалось Mishel; 02.03.2004 в 19:50.
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 (архив в двух томах):
Успехов!