книги хакеры / журнал хакер / 190_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
w Click |
to 90 |
|
|
m |
||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Malware
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
ХАКЕР 11 /190/ 2014 |
|
|
|
|
|
|||||
w Click |
to |
|
|
|
|
|
m |
|||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Franck Boston@shutterstock.com
Евгений Дроботун drobotun@xakep.ru
МАЛВАРЬСО
СТРАННОСТЯМИ
WWW
Для AutoIt существует визуальный редактор графического интерфейса, похожий на Delphi, — Koda FormDesigner. Познакомиться с ним можно здесь: goo.gl/CaQi9l.
РАЗБИРАЕМ КЛЮЧЕВЫЕ ФРАГМЕНТЫ КОДА МАЛВАРИ НА СКРИПТАХ И СРЕДСТВАХ АВТОМАТИЗАЦИИ
Мы уже давно не заикаемся об ассемблере, поскольку привыкли к тому, что большая часть современной малвари пишется на C++, C# или даже VB. Однако из антивирусных компаний передают, что вирмейкеры XXI века пользуются не только классическими языками программирования. Оказывается, вполне злая и функциональная малварь теперь пишется
на батниках, AutoIt, Lua, Python, 1C... Сегодня мы попробуем заглянуть под капот этому «программному обеспечению» и рассмотреть ключевые, ответственные за главный функционал участки кода.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
|
|
|
|
||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
||
P |
|
|
|
|
NOW! |
o |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
Малварь со странностями |
|
|
|
w Click |
to |
ХАКЕР 11 /190/ 2014 |
|
|
|
||||||||||
|
|
|
|
|
|
m |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
|
||
|
|
p |
|
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
BAT-СКРИПТЫ |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
Если ты думаешь, что единственный возможный вариант та- |
Вот так меняет со- |
|||||||||
|
|
|
|
|
кого рода малвари — это классический школьный батник |
держимое файла hosts |
|||||||||
|
|
|
|
|
со строкой format c: внутри, то ты ошибаешься. |
Trojan.BAT.Qhost.abq |
|||||||||
|
|
|
|
|
|
|
Возможность автоматизировать всякие рутинные опера- |
|
|
|
|||||
|
|
|
|
|
ции в системе с помощью bat-скриптов уже давно переросла |
|
|
|
|||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
в целое направление создания малвари, для которой почти |
Кусочек кода bat- |
|||||||||
|
|
|
|
|
все антивирусные компании отвели целый раздел в своих |
winlocker’а BAT/ |
|||||||||
|
|
|
|
|
классификациях вредоносного программного обеспечения. |
LockScreen. |
|||||||||
|
|
|
|
|
|
|
К примеру, с помощью команды ftp можно загрузить |
|
|
|
|||||
|
|
|
|
|
из сети нужный файл, сохранить его в нужном месте и запу- |
|
|
|
стить на выполнение, а также добавить этот файл в автозагрузку, написав внутри что-нибудь вроде этого:
WARNING
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.
@reg add "HKCU\Software\Microsoft\Windows\
CurrentVersion\Run"
/v Trojan /t REG_SZ /d C:\Trojan.bat /f
В итоге получается простейший Bat.Downloader, который исправно будет выполнять свои функции.
Помимо этого, с помощью команды taskkill можно попытаться остановить работающие процессы мешающих вредоносному функционалу программ:
// Убиваем explorer.exe
@taskkill /im explorer.exe /f > nul
// Убиваем некий антивирус aver.exe. С большой
вероятностью не получится ;)
@taskkill /im aver.exe /f > nul
Один из многочисленных генераторов batмалвари (большинство антивирусных компаний относят поделки такого рода к Riskware)
Скрипт Trojan.BAT. Qhost.abq в виде exe-файла в секции ресурсов
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
|
|
|
|
|
||
w Click |
to |
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Обычно малварь перед началом своей деятельности проверяет наличие в системе антивирусов и далее действует по результатам. В bat-скрипте это можно сделать с помощью команды tasklist:
//Проверяем наличие процесса aver.exe
@for /F "delims=" %%A in
('tasklist /FI "imagenameeq aver.exe"') do @set sr=%%A
@if "%sr:~,11%"=="aver.exe" goto ff
...
//Процесс обнаружен
//Выполняем соответствующие действия
...
@goto bb :ff
...
//Процесс не обнаружен
//Выполняем соответствующие
действия
...
:bb
...
// Работаем дальше
Что касается непосредственно вредоносных действий, то здесь имеется достаточно широкое поле для деятельности: можно удалять или перемещать различные системные файлы, изменять содержимое конфигурационных файлов (в том числе и файла hosts), изменять значения в реестре, блокируя тем самым, например, возможность вызова taskmgr.exe или запрещая вносить изменения в реестр.
В Сети можно найти большое количество генераторов bat-малвари. Конечно, всерьез воспринимать все то, что выходит из-под пера этих генераторов, вряд ли стоит, но для не слишком искушенных пользователей даже остановка explorer.exe может стать неразрешимой проблемой.
Для приведения вредоносных скриптов в более привычный вид исполняемого файла создатели этих скриптов нередко пользуются утили-
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
w Click |
to 92 |
|
|
|
m |
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Malware
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
ХАКЕР 11 /190/ 2014 |
|
|
|
|
|
|||||
w Click |
to |
|
|
|
|
|
m |
|||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|
|
|
|
стемой на достаточно низком уровне и поддерживает вызов |
|
|
|
|
API-функций. Например, чтобы внедрить свой код в какой-ни- |
|
|
|
|
будь процесс, нужно написать нечто вроде: |
|
|
|
|
// Разрешения для OpenProcess |
|
|
|
|
Local $PERMISSION = |
|
|
|
|
BitOR(0x0002, 0x0400, 0x0008, 0x0010, 0x0020) |
|
|
|
|
... |
|
|
|
|
... |
|
|
|
|
$hProcess = DllCall("kernel32.dll", "ptr", |
|
|
|
|
"Open Process", "dword", $PERMISSION, "int", 0, |
|
|
|
|
"dword", $Process) |
|
|
|
|
... |
|
|
|
|
... |
|
|
|
|
DllCall("kernel32.dll", "int", "WriteProcess |
|
|
|
|
Memory", "ptr", $hProcess, "ptr", $pMem, "ptr", |
|
|
|
|
$buffer, "uint", 260, "uint*", 0) |
|
Конфигурационный |
... |
||
|
батник RemoteAdmin. |
... |
||
|
Win32.RAdmin.20 |
DllCall("kernel32.dll", "ptr", "Create |
||
|
|
|
|
RemoteThread", "ptr", $hProcess, "ptr", 0, "uint", |
|
|
|
|
0, "ptr", $pMem, "ptr", $pMem, "dword", 0, "ptr",0) |
|
Содержимое |
|||
|
|
|||
|
SFX-архива Win32. |
Помимо всех возможностей этого языка, большим плюсом |
||
|
BitCoinMiner.nni (вы- |
для создателей малвари выступает возможность обфускации |
||
|
делен запускающий |
кода при его компиляции. Для этого достаточно в начале про- |
||
|
VBS-скрипт) |
граммы написать две строки вида: |
||
|
|
|
|
// Запустить обфускатор перед компиляцией |
|
|
|
|
#Autoit3Wrapperr_Run_Obfuscator=y |
|
|
|
|
// Установить параметры обфускации |
|
|
|
|
#Obfuscator_Parameters=/StripOnly /OM |
|
|
|
|
В целом, если не принимать во внимание объем создава- |
|
|
|
|
емого компилятором AutoIt исполняемого кода, язык неплохо |
тами конвертации типа bat2exe. Это работает, хотя ни о какой |
|
|
INFO |
справляется с большинством задач, которые ставят перед со- |
полноценной компиляции здесь говорить не приходится: сам |
|
|
бой вирусописатели. Нередко попадаются весьма продвину- |
|
скрипт пишется в exe-файл в виде ресурсов, а затем вызыва- |
|
|
|
тые экземпляры, использующие разные техники внедрения |
ется cmd.exe, где скрипт и выполняется. |
|
|
В составе Windows |
и сокрытия кода, шифрование тела малвари и прочие хитро- |
САМОРАСПАКОВЫВАЮЩИЕСЯАРХИВЫ |
|
|
(начиная с Windows |
сти. |
|
|
XP) имеется утилита |
PYTHON,LUAИПРОЧАЯЭКЗОТИКА |
|
Self-extracting archive (SFX-архивы), а точнее возможность |
IExpress, позволяющая |
|||
сложить несколько файлов в один архив с автоматическим |
создавать CAB-архивы, |
Несмотря на то что Python — настоящий хакерский язык |
||
запуском одного из них после распаковки уже давно пригля- |
|
в том числе и саморас- |
программирования, малварь на нем под винду встречается |
|
нулись распространителям сомнительного софта и контента. |
|
|
паковывающиеся. |
не очень часто. В большей степени написание ее оправданно |
Зачастую в эти архивы кладут вполне легальные программы |
|
|
|
для OS Х или Linux, в которых Python установлен вместе с си- |
вместе с конфигурационным или запускающим батником (или |
|
|
|
стемой. |
скриптом на VBS), который позволяет использовать такие ар- |
|
|
|
Для винды вредоносные Python-скрипты, как правило, |
|
|
|
||
хивы с не совсем благими намерениями. |
Декомпилированный |
компилят в исполняемый файл (на самом деле это тоже не |
||
К примеру, SFX-архив RemoteAdmin.Win32.RAdmin.20 со- |
AutoIt-код Backdoor. |
полноценная компиляция — в exe-файл кладется сам скрипт |
||
держит в себе серверный модуль широко известной утилиты |
Win32.DarkKomet.djqs |
и интерпретатор Python’а). |
||
удаленного администрирования Radmin и bat-скрипт, с помо- |
|
|
|
|
щью которого производится конфигурирование и скрытый за- |
|
|
|
|
пуск серверного модуля Radmin. Свою конфигурацию Radmin |
|
|
|
|
хранит в реестре, и скрипт, находящийся в архиве, перед за- |
|
|
|
|
пуском Radmin’а прописывает необходимые параметры в нуж- |
|
|
|
|
ных ветках реестра. |
|
|
|
|
С появлением в широком обиходе различных криптова- |
|
|
|
|
лют SFX-архивы полюбились и многим желающим помайнить |
|
|
|
|
цифровую наличность на чужих вычислительных мощностях. |
|
|
|
|
В большинстве случаев утилиты для майнинга состоят из не- |
|
|
|
|
скольких файлов, и самораспаковывающийся архив как нель- |
|
|
|
|
зя лучше подходит для того, чтобы все эти файлы туда спря- |
|
|
|
|
тать. Разумеется, в архив помещается batили VBS-скрипт, |
|
|
|
|
запускающий все это дело с нужными параметрами. |
|
|
|
|
В некоторых SFX-архивах такого рода также содержится |
|
|
|
|
утилита Hidden Start, которая обеспечивает скрытый запуск |
|
|
|
|
основной программы вредоносного архива. |
|
|
|
|
AUTOIT |
|
|
|
|
Изначально AutoIt предназначался для автоматизации и вы- |
|
|
|
|
полнения часто повторяющихся задач.В более поздних верси- |
|
|
|
|
ях язык обрел черты большинства распространенных языков |
|
|
|
|
общего назначения. |
|
|
|
|
В настоящее время на AutoIt пишется довольно большое |
|
|
|
|
количество малвари. Язык позволяет взаимодействовать с си- |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|
w Click |
to |
ХАКЕР 11 /190/ 2014 |
||||||||
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Малварь со странностями
|
|
|
|
hang |
e |
|
|
|
|
||
|
|
|
C |
|
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
93 |
|
|
|
|
|
|
||
w Click |
to |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Сомнительный Python-скрипт |
Python-скрипт для Mac |
для Linux под названием |
Backdoor.Python.Aharm.a |
Backdoor.Python.RShell |
|
Что касается языка программирования Lua, то самым известным вредоносом, который был написан с его использованием, был Worm.Win32.Flame. Для большей части компонентов этого червя логика верхнего уровня реализована именно на Lua. Всего в Worm.Win32.Flame можно насчитать 57 Lua-компонентов, каждый из которых выполняет какую-либо вредоносную функцию. К примеру, скрипт ATTACKOP _ JIMMY _ PRODS.lua производит атаку на другой ПК, скрипт с названием casafety.lua служит для обнаружения антивирусного ПО, CRUISE _ CRED.lua — для кражи учетных данных, а euphoria.lua эксплуатирует уязвимость в LNK-файлах.
Вредоносный код можно написать на чем угодно, даже на языке для 1С:Предприятие
Часть списка Lua-скриптов из состава Worm.Win32.Flame
Кусочек скрипта ATTACKOP _ JIMMY _
PRODS.lua
ЗАКЛЮЧЕНИЕ
Как показывает повседневная практика вирусных аналитиков, вредоносный код можно написать на чем угодно, и в коллекциях семплов вредоносного кода многих антивирусных компаний встречаются весьма экзотические образцы, написанные, к примеру, на встроенном языке программирования системы «1С:Предприятие» (Virus.1C.Bonny.a, Virus.1C. Bonny.b или Virus.1C.Tanga.а). Мы можем называть перечисленные в статье поделки странными и нетипичными, но они есть, они работают, а «1С:Предприятие», как известно, установлено на очень большом количестве компьютеров нашей родины…
Virus.1C.Tanga.а на VirusTotal |
Кусочек кода Virus.1C.Tanga.а |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
w Click |
to 94 |
|
|
m |
||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Кодинг
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
ХАКЕР 11 /190/ 2014 |
|
|
|
|
|
|||||
w Click |
to |
|
|
|
|
|
m |
|||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Юрий «yurembo» Язев, |
КОДИМ |
|
независимый игродел |
|
|
yazevsoft@gmail.com |
ДЛЯ |
|
|
|
РАЗБИРАЕМСЯ |
|
|
В ПРОДВИНУТОЙ |
MOTION |
||
LEAP |
СИСТЕМЕ ЖЕСТОВОГО |
|
УПРАВЛЕНИЯ |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|
w Click |
to |
ХАКЕР 11 /190/ 2014 |
||||||||
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
X |
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
Кодим для Leap Motion |
|
|
|
95 |
|
|
|
|
|
||
w Click |
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
m |
|||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
-x cha |
|
|
|
|
Leap Motion Controller вошел в десятку лучших устройств года
по версии журнала Time. Этот девайс относится к славной семейке беспроводных контроллеров нового поколения, таких как Wii Remote, PlayStation Move, однако ближайшим его родственником является Xbox Kinect. В отличие от последнего, Leap Motion реагирует на движения исключительно рук, он в 200 раз точнее определяет даже самые быстрые движения кистей и пальцев. Это устройство еще плотнее приближает нас к настоящей виртуальной реальности — к созданию естественного интерфейса между человеком и машиной.
Willyam Bradberry@shutterstock.com
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
Кодинг |
|||
|
|
|
|
|
|
|
|
|
|
||
w Click |
to 96 |
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
LEAPMOTIONCONTROLLER
После выхода сенсора Kinect на волне его успеха стали появляться другие устройства бесконтактного управления. Kinect послужил основой для роста и развития рынка подобных устройств: инвесторы увидели перспективу и поняли смысл вложения средств в устройства жестового управления. Однако наиболее значимым и успешным стал Leap Motion Controller. Как и прародитель, последний основан на технологии захвата движения. Это устройство подключается к порту USB и по размеру не превышает пары сложенных флешек. С технической стороны для захвата проекции пользовательских рук в пространстве устройство Leap использует два оптических сенсора (камеры) и инфракрасный источник света (разработчики не исключают, что в будущих версиях устройства количество камер может быть изменено).
Девайс размещается рабочей поверхностью кверху рядом с экраном, чтобы создать ощущение, будто объектами на экране управляют с помощью рук. После подключения устройства над ним образуется виртуальная перевернутая пирамида с центральной вершиной в устройстве. Наиболее эффективный диапазон распространяется от 25 до 600 мм над контроллером с областью видимости 150 градусов. В области этой пирамиды Leap Motion «видит» все движения и пересылает их софту, который преобразует данные и сигналы в координаты и сообщения. Софт способен распознать как простые жесты (виртуальные прикосновения, нажатия), так и сложные продолжительные движения: масштабирование, перемещение, вращение, рисование различных геометрических фигур. Таким образом, само устройство не выполняет никаких вычислений и преобразований, отдавая все на откуп софту хоста, который, удаляя шумы изображения, строит модели рук и пальцев-указателей.
Имея начало координат в центре устройства, Leap Device интерпретирует оси координат следующим образом: отрицательная X расположена слева от устройства, соответственно, положительная — справа. Координата Y растет вверх и не имеет отрицательных значений, так как Leap «видит» объекты, начиная с 25 мм выше себя. Положительная Z располагается в направлении к пользователю, тогда как отрицательная — к экрану.
LEAPMOTIONSDK
Leap Motion SDK развивается удивительно бурно, а новые версии выходят с завидной регулярностью: за сравнительно недолгую историю его существования уже появилась полноценная вторая версия тулз, а также ее модификации. Точнее, моды находятся еще в стадии беты, и мы будем использовать самую последнюю на момент написания статьи версию SDK, поскольку каждая новая версия предоставляет видимые улучшения — дополнительные возможности слежения за скелетом («костями» рук). Как и следовало ожидать, Leap Motion SDK работает на всех распространенных платформах: Windows NT, OS X, Linux. Так как в последнее время мне больше приходится работать на Маке (а я вот редактирую эту статью на EEE PC с Win XP, и мне норм. — Прим. ред.), то в дальнейшем мое повествование (с некоторыми оговорками) будет касаться именно этой операционной системы. Если ты с ней не дружишь, не отчаивайся, ведь Leap Motion SDK кросс-платформенный, и ты без труда сможешь адаптировать полученные из этой статьи сведения для любой поддерживаемой операционной системы.
ГОТОВВКАЛЫВАТЬ!
Для начала работы с контроллером Leap Motion, предварительно зарегистрировавшись на сайте производителя устройства, из раздела Downloads (https://developer. leapmotion.com/downloads/skeletal-beta) скачай архив LeapDeveloperKit_2.1.1+21671_mac.tar. Распаковав его, ты обнаружишь папку, внутри которой будет бандл Leap_Motion_ Installer_skeleton-release_public_mac_x64_2.1.1+21671_ ah1704.dmg (образ диска для OS X), содержащий драйверы для работы устройства, а также демоаппликации. Рядом с бандлом будет находиться директория LeapSDK, включающая все необходимые библиотеки и API для разработки приложений, работающих с устройством Leap Motion. Вдобавок в этой папке находится документация и сэмплы. Кроме де-
Рис. 1. Airspace
Рис. 2. Программа установки Leap Motion Software
|
|
|
|
hang |
e |
|
|
|
|
||
|
|
|
C |
|
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
|
|
|
|
|
|
||
ХАКЕР 11 /190/ 2014 |
|
|
|
|
|
||||||
w Click |
to |
|
|
|
|
|
|
m |
|||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2
моприложений, бандл содержит Airspace Home, своего рода клиент для магазина приложений Leap Motion — в него можно загружать свои приложения и продавать их, как на других площадках цифровой дистрибуции.
Основное отличие второй версии SDK от первой — это новая система слежения за «скелетом» верхних конечностей. В нее включена обработка дополнительной информации о костях рук и пальцев, возможность предсказания расположения невидимых для устройства костей и построение моделей рук в тех условиях, когда полностью конечности не видны.
Сначала установи содержимое бандла (уверен, под Windows он имеет такое же название, только с расширением exe). Сама установочная программа, находящаяся внутри образа, называется Leap Motion.pkg, она запускает процесс инсталляции всего перечисленного выше.
После завершения установки софта для Leap Motion автоматически запустится драйвер, который в виде демона «поселится» в строке меню (справа сверху). В «Программах» появятся три новых приложения: сам драйвер, демопрограмма Leap Motion Orientation (рекомендую начать с нее) и Airspace. Если ранее контроллер не был подключен, самое время сделать это. Значок (в строке меню) подсветится зеленым цветом. В результате щелчка на нем откроется меню, содержащее пять пунктов. Первый пункт Launch Airspace запускает одноименный оконный клиент. По умолчанию в нем присутствуют семь демоприложений и две ссылки, ведущие в Airspace Store и комьюнити разработчиков. Каждая из демонстраций раскрывает возможности Leap Motion.
Следующий пункт меню — Settings открывает окно для настройки устройства. Это окно включает четыре вкладки. На странице Generals производятся основные настройки: разрешить или запретить устройству взаимодействовать с веб-приложениями, которые поддерживают Leap Motion (забегая вперед, отмечу, что такая возможность присутствует, и для этого используется HTML5 + JavaScript), включить
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|
w Click |
to |
ХАКЕР 11 /190/ 2014 |
||||||||
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Кодим для Leap Motion
3
|
|
|
|
hang |
e |
|
|
|
|
||
|
|
|
C |
|
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
97 |
|
|
|
|
|
|
||
w Click |
to |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
или выключить возможность получать сигналы от устройства |
Рис. 3. Клиент Airspace |
ты легко сможешь переделать наши проги для другой поддер- |
приложениям, работающим в фоне, автоматически пере- |
|
живаемой операционной системы. Мы не будем разрабаты- |
давать статистику устройства, включить (при необходимо- |
Рис. 4. Визуализатор |
вать консольное приложение, которое показывает координа- |
сти) переход в энергосберегающий режим; настроить наи- |
|
ты, передаваемые контроллером, это скучно. Сразу же окунем |
меньшую высоту над устройством, при которой оно «видит» |
|
голову в серьезный код и напишем приложение, выводящее |
руки и пальцы (указатели); согласиться на автоматическое |
|
графическое представление. |
обновление. На странице Tracking присутствуют два пара- |
|
Визуализация |
метра, относящиеся к настройке возможности «слежения» |
|
|
устройством. Следующая вкладка посвящена диагностиро- |
|
Leap Motion SDK предоставляет чудесные средства для по- |
ванию и устранению неполадок, здесь присутствуют функ- |
|
лучения данных от контроллера, но в нем совсем ничего |
ции просмотра лога ПО, диагностический визуализатор, |
|
нет для вывода графики. Поэтому наш путь лежит через ис- |
повторная калибровка устройства и возврат к настройкам |
|
пользование дополнительных тулз. Чтобы вывести графику |
по умолчанию. Последняя же вкладка просто сообщает инфу |
|
из нативного приложения под OS X, надо воспользоваться |
об устройстве и обслуживающем его софте. |
|
OpenGL. Но от этой идеи веет грустью: слишком низкий уро- |
Щелчком по пункту Visualiser открывается демонстратор, |
|
вень, никакой статьи не хватит, и вообще уснуть можно. По- |
в нем можно посмотреть, как устройство «видит» конечно- |
|
этому мы воспользуемся надстройкой над OpenGL. Из все- |
сти. То есть, если переместить руки над активной областью |
|
го широчайшего ряда подобных библиотек я выбрал Cinder |
устройства, приложение отобразит их в виртуальном про- |
|
(libcinder.org). |
странстве. Кнопка Pause Tracking приостанавливает слеже- |
|
Cinder представляет собой набор библиотек с открытым |
ние, Quite — вырубает демон. |
|
исходным кодом для обработки изображений, работы с гра- |
Когда ПО для Leap Motion будет установлено, можно |
|
фикой, звуком, вычислительной геометрией. Как я уже сказал |
ставить инструменты разработчика. При этом я полагаю, |
|
выше, Cinder кросс-платформенна, и один и тот же код бу- |
что у тебя установлены самые новые версии операционной |
|
дет работать не только на десктопных платформах, но также |
системы и тулз для разработки (Xcode). Как я говорил выше, |
|
на смартфонах и планшетах от Apple. В будущем разработчи- |
после распаковки архива папка с SDK находится рядом |
|
ки собираются расширить круг поддерживаемых аппаратных |
с бандлом установки. Эта папка содержит документацию, |
|
и программных платформ. Вдобавок для генерации заготов- |
примеры, заголовочные и объектные файлы для всех офици- |
|
ки нового проекта в поставку Cinder входит утилита TinderBox, |
ально поддерживаемых языков. |
|
с ее помощью можно создать проект с поддержкой OpenGL, |
Изначально Leap Motion SDK написан на C++, но благо- |
|
DirectX, CocoaView (OpenGL), каждая из этих заготовок мо- |
даря SWIG имеет поддержку многих распространенных ком- |
|
жет содержать в себе поддержку физического движка Box |
пилируемых и интерпретируемых языков, среди которых C# |
|
2D, библиотеку рендеринга Cairo, аудиобиблиотеку FMOD, |
(вместе с фреймворками .NET и Mono плюс движком Unity 3D), |
|
библиотеку компьютерного зрения OpenCV. Для Apple- |
Objective-C, Java, Python, JavaScript. SWIG, являясь свобод- |
|
устройств можно сгенерировать заготовку, где будут исполь- |
ным инструментом с открытым исходным кодом, играет роль |
|
зоваться менеджеры геолокации и движения, при помощи |
генератора связующего кода между C++ и другими языками. |
|
стандартных фреймворков (Core Location, Core Motion). Все |
Для своих разработок мы возьмем C++, как самый родной. |
|
это с легкостью можно включить в проект на этапе его созда- |
Клиентский компьютер и контроллер взаимодействуют |
|
ния с помощью GUI-интерфейса. Кроме того, проект можно |
по TCP-соединению, при котором открываются порты 6437, |
|
сгенерировать под определенную среду программирования |
6438, 6439 — для корректной работы устройства необходимо |
|
и операционное окружение: Xcode (Mac), Xcode (iOS), VC |
проследить, чтобы они не блокировались файрволом. |
|
12/13 (WinRT). Следствие: мы имеем больше, чем библиотеку |
Leap Motion SDK позволяет разрабатывать приложения |
|
API, все это напоминает кросс-платформенный игровой дви- |
двух видов: поддерживающие нативный интерфейс (клиент- |
|
жок! Также можно сразу создать локальный Git-репозиторий. |
ские приложения) и интерфейс WebSockets (веб-приложения, |
|
По моему скромному мнению, Cinder скоро станет наилуч- |
работающие в среде браузера). Первые для работы (полу- |
|
шим кросс-платформенным решением, даже в сравнении |
чения данных от контроллера) используют динамическую |
|
с Qt. |
библиотеку — конкретную для определенной операционной |
|
Так как в Cinder активно используется boost, его неплохо |
системы, она подключается к устройству и предоставляет |
|
обновить до последней версии. Открываем любимую кон- |
сервис верхнему уровню. Тогда как вторые получают данные |
|
соль и сначала поставим систему управления устаревшими |
через сервер WebSockets локального хоста в виде сообще- |
|
(на суровый взгляд Apple) пакетами Homebrew: |
ний формата JSON. В этом случае используется JavaScript |
|
ruby -e "$(curl -fsSL https://raw.github.com/ |
+ open source надстройка LeapJS, и для управления устрой- |
|
|
ством приложение может передавать конфигурационные со- |
|
Homebrew/homebrew/go/install)" |
общения через сервер WebSockets обратно девайсу. |
|
|
КОДИНГДЛЯLEAPMOTION |
|
После чего из этой системы установим boost 1.55: brew |
|
install boost. Для работы непосредственно с Cinder ее доста- |
|
Сегодня мы сконцентрируемся на нативных приложениях |
|
точно скачать и распаковать, а для генерации проекта — ис- |
для OS X, но благодаря кросс-платформенности инструментов |
|
пользовать размещенную в подпапке tools утилиту TinderBox. |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
w Click |
to 98 |
|
|
m |
||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Кодинг
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
ХАКЕР 11 /190/ 2014 |
|
|
|
|
|
|||||
w Click |
to |
|
|
|
|
|
m |
|||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Руки,пальцы,управлениепространством |
|
|
5 |
|
Итак, для разминки создадим приложение, которое выво- |
|
|
|
|
дит в окно то, что видит сенсор. Если ты читал мои статьи про |
|
|
|
|
Kinect, то можешь помнить, что там мы начинали так же, будем |
|
|
|
|
считать это традицией. Заготовка из TinderBox для OpenGL |
|
|
|
|
нам прекрасно подойдет, надо только добавить в нее под- |
|
|
|
|
держку Leap Motion. |
|
|
|
|
Для этого из подкаталога include ранее распакованной |
|
|
|
|
папки LeapSDK (об этом см. выше) в дерево каталогов проекта |
|
|
|
|
среды Xcode перетащи два файла: Leap.h и LeapMath.h. Когда |
|
|
|
|
перенос будет завершен, появится диалоговое окно, где надо |
|
|
|
|
указать способ вставки / связывания файлов с проектом; по- |
|
|
|
|
ставь флажок Destination → Copy items into destination group’s |
|
|
|
|
folder (if needed), отметь галкой Folders →Create groups for any |
|
|
|
|
added folders и ниже отметь проект, к которому происходит |
|
|
|
|
добавление файлов. Кроме того, еще нужна динамическая |
|
|
|
|
библиотека. Так как компилятор языка C++ (LLVM), входящий |
|
|
|
|
в Xcode, следует стандарту C++11, то необходимо использо- |
|
|
|
|
вать библиотеку, скомпилированную с его вмешательством. |
|
|
|
|
Такая либа есть, она называется (версия для OS X) libLeap. |
|
|
|
|
dylib и находится в подкаталоге libc++ подпапки lib каталога |
|
|
|
|
LeapSDK. Либу тоже надо переместить в систему Xcode, с та- |
|
|
|
|
ким же последующим прохождением диалога. Теперь надо |
|
|
|
|
указать среде Xcode использовать добавленную в проект либу. |
|
|
|
|
В дереве файлов/каталогов проекта щелкни на имени проекта |
|
|
|
|
(верхний пункт), откроется меню конфигурирования проекта. |
|
|
|
|
Перейди на вкладку Build Phases. В левом верхнем углу вклад- |
|
|
|
|
ки, щелкнув на знаке «плюс», из появившегося контекстного |
|
{ |
|
|
меню выбери пункт New cope files build phase. В нижней ча- |
Рис. 5. Что видит Leap |
|
||
сти вкладки появится свернутая панель Copy Files. Развернув |
Motion Controller |
settings->setWindowSize( 1024, 768 ); |
||
ее, из ниспадающего списка Destination выбери Executables, |
|
settings->setFrameRate( 60.0f ); |
||
а в пустой список файлов (ниже) из дерева проекта перетащи |
|
} |
|
|
динамическую либу, при этом флажок Copy only when installing |
|
|
|
|
должен быть снят. Теперь она подключена к проекту. |
|
Уверен, комментарии здесь излишни. |
||
Следующее действие нужно, чтобы сенсор передавал «сы- |
|
Добавим в основной класс приложения текстуру OpenGL: |
||
рые» данные изображения того, что он видит; в настройках |
|
gl::Texture tex;. Она пригодится нам для вывода. В функции |
||
Leap Motion (пункт Settings контекстного меню значка девай- |
|
update мы по кадрам будем получать изображения от сенсо- |
||
са в строке меню) на закладке General надо отметить флажок |
|
ра, затем их обрабатывать и отображать на текстуре (см. ис- |
||
Allow Images. |
|
ходник). На каждом кадре мы получаем кадр контроллера: |
||
Сгенерированная TinderBox’ом заготовка включает не- |
|
Frame frame = controller.frame();. Объект класса Frame содер- |
||
сколько папок, файлов и необходимых фреймворков. Посколь- |
|
жит в себе все остальные объекты, информацию о которых |
||
ку я назвал проект RawImagesApp, я добавил заголовочный |
|
генерирует контроллер. Нам надо просто извлечь их из него. |
||
файл RawImages.h. В него я поместил подключение заголо- |
|
К слову, получение кадра таким способом — самостоятельно |
||
вочных файлов Cinder’а и Leap’а, включение пространства |
|
его брать у контроллера (последовательный опрос устрой- |
||
имен Leap и объявление объекта контроллера Leap Motion, |
|
ства) — наиболее просто и используется чаще всего. Любые |
||
собственно, он является центральным предметом разговора. |
|
промежуточные моменты предрешены: если при следующем |
||
Вдобавок TinderBox сгенерировал исходный код для нашего |
|
опросе новый кадр еще не готов, то возвращается старый; |
||
проекта, он послужит хорошей отправной точкой для разви- |
|
если при последующем опросе готовы уже несколько кадров, |
||
тия. В cpp-файле содержится основной класс (в моем случае |
|
то они помещаются в историю. Есть еще один способ получе- |
||
RawImagesApp) приложения, соответствующий имени проек- |
|
ния кадров, но пока он нам не нужен, и мы перенесем его рас- |
||
та и унаследованный от базового класса Cinder — AppNative. |
|
смотрение на следующий раздел. |
||
Окно создается с помощью макроса CINDER_APP_NATIVE. |
|
Получив кадр, мы извлекаем из него снятые сенсором изо- |
||
В классе RawImagesApp объявлены и реализованы вирту- |
|
бражения: ImageList images = frame.images();. Всего их два, |
||
альные функции базового класса. Функция setup вызывается |
|
поскольку в сенсоре две камеры, поэтому в каждый момент |
||
при старте приложения, сюда помещается код для его ини- |
|
два изображения. Далее мы последовательно обрабатыва- |
||
циализации: для вывода «сырых» графических данных в этом |
|
ем оба. Сначала в строке const unsigned char * image_buffer |
||
методе необходимо установить особый флаг политик сенсора, |
|
= image.data (); получаем данные картинки; в определенный |
||
для чего надо вызвать метод setPolicyFlag, в который передать |
|
момент от контроллера мы можем получить разные изобра- |
||
значение POLICY_IMAGES контроллера. Функция update вы- |
|
жения — не только по содержимому, но и по размеру. В сле- |
||
зывается в каждом кадре для обновления; draw вызывается |
|
дующей строке создается объект графической поверхности |
||
для перерисовки контента; mouseDown — при нажатии клави- |
|
(Surface), входящий в Cinder API. Его конструктору переда- |
||
ши мыши. По умолчанию включены не все возможные функ- |
|
ются четыре параметра: ширина и высота поверхности, ис- |
||
ции, можно, например, добавить prepareSettings — функцию, |
|
пользование альфа-канала, последовательность цветовых |
||
которая вызывается до создания окна и позволяет передать |
|
каналов (константа SurfaceChannelOrder::RGBA соответствует |
||
ему параметры. Добавим эту функцию, чтобы при создании |
|
стандарту: красный, зеленый, синий, альфа, однако имеется |
||
окно было большего размера, также установим для него ча- |
|
ряд других, например, в GDI или Quartz используются другие |
||
стоту обновления. Объявление внутри класса RawImagesApp |
|
цветовые последовательности). Затем с помощью итерато- |
||
выглядит так: |
|
ра обходятся все пиксели (пока пустой) поверхности. Внутри |
||
void prepareSettings |
|
|
этого цикла устанавливается цвет пикселей. Я решил придать |
|
|
выводимому изображению красноватый оттенок (как в DOOM |
|||
( ci::app::AppBasic::Settings* settings ); |
|
:)). Поэтому для красного канала каждого пикселя устанавли- |
||
|
|
|
вается значение, соответствующее значению из данных изо- |
|
а реализация так: |
|
бражения. Остальные каналы обнуляются. После обхода всего |
||
void RawImagesApp::prepareSettings |
|
|
изображения мы конструируем объект — текстуру с помощью |
|
|
метода gl::Texture на основе переданной в параметре по- |
|||
( Settings* settings ) |
|
|
верхности. Если сейчас вывести текстуру на экран, она будет |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|
w Click |
to |
ХАКЕР 11 /190/ 2014 |
||||||||
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Кодим для Leap Motion
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
|
|
|
|
|
||
w Click |
to |
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
6 |
метод onFrame и передает ему кадр (в параметре), выше мы |
|
упоминали этот метод. Кстати, зачем нам понадобился мью- |
|
текс? Дело в том, что при использовании прослушивания — |
|
функции обратного вызова — onFrame вызывается в много- |
|
поточном режиме. То есть каждый ее вызов осуществляется |
|
в независимом потоке. Поэтому нам необходимо позаботить- |
|
ся о потокобезопасности в момент получения кадра от девай- |
|
са, чему служит мьютекс. При прослушивании также можно иг- |
|
норировать приход нового кадра (например, если прошедший |
|
кадр еще не обработан) и добавить его в историю (для после- |
|
дующей обработки). |
|
Возвратимся к нашему коду, к месту создания объекта на- |
|
шего класса Device. После его создания для него устанавлива- |
|
ется функция обратного вызова. |
Перерисовка
Но самое интересное происходит в методе перерисовки. Сна-
|
|
чала выполняются подготовительные действия: очищение |
|
|
экрана, установка текущих матриц для камеры, включение |
|
|
альфа-смешивания, возможности чтения и записи в буфер |
|
|
глубины, установка цвета для рисования. Затем начинается |
|
|
непосредственное рисование: мы получаем от устройства |
|
|
трехмерные вектора положения локтя и запястья и методом |
|
|
gl::drawLine рисуем между этими точками линию. Далее полу- |
|
|
чаем количество пальцев и в цикле с помощью итератора про- |
|
|
бегаем по контейнеру, их содержащему. В Leap Motion каждый |
|
|
палец состоит из четырех частей (фаланг): периферической, |
|
|
промежуточной, проксимальной и пястной. Хотя на большом |
слишком маленькая. Поэтому предварительно отмасштабиру- |
Рис. 6. Силуэт руки |
пальце настоящей человеческой руки последняя фаланга |
ем ее: glScalef(2.0, 3.0, 0.0);. Теперь отобразим: gl::draw(tex);. |
|
отсутствует, здесь она есть, но имеет нулевое значение. Во |
Кости |
|
вложенном цикле, обходя все фаланги, получаем координаты |
|
различных их частей: начало, центр, конец, направление. Ко- |
|
В следующем примере мы отобразим наши руки в машинном |
|
ординаты представлены в виде векторов (Vec3f). Также внутри |
контексте, то есть нарисуем их в соответствующих координа- |
|
этого подцикла осуществляется рисование фаланг с помощью |
тах. Эта задача будет сложнее, чем предыдущая, а LeapSDK |
|
метода drawLine, которому передаются найденные координа- |
все-таки предоставляет довольно низкоуровневый интер- |
|
ты. Дополнительно из первых фаланг формируется контейнер |
фейс, поэтому для упрощения нашей задачи мы воспользуем- |
|
суставов (knuckles). Когда происходит выход из внешнего |
ся готовыми наработками. |
|
цикла, рисуются линии, соединяющие пальцы и образующие |
Американский программист Стивен Шейберл (Stephen |
|
кисти рук. На этом веселье перерисовки заканчивается. От- |
Schieberl), под ником Ban the Rewind, разработал пару классов |
|
компиль и запусти прогу, задержи руки над сенсором, и в окне |
(Listener наследуется от Leap::Listener и Device), выполняющих |
|
отобразятся очертания твоих конечностей. |
всю типичную работу, связанную с обработкой и возвращени- |
|
ИТОГИ |
ем состояний устройства. Вдобавок Стивен поместил в файл |
|
|
функции, которые выполняют подсчеты координат и матриц, |
|
Leap Motion — революционный контроллер, он не только за- |
что позволит нам сконцентрироваться на более высокоуровне- |
|
менил сенсорный экран, но и подарил нам управление про- |
вой работе. В первую очередь эти вычисления связаны с тем, |
|
странством, сделав еще более прозрачной границу между |
что в отличие от координат рабочего стола операционной си- |
|
реальным миром и виртуальной реальностью. На уровне |
стемы, где ось Y растет сверху вниз, начало координат для Leap |
|
разработчика ПО мы получаем удобный программный интер- |
Motion (0, 0, 0) находится в левом нижнем углу (Y растет снизу |
|
фейс, позволяющий управлять всеми возможностями сенсо- |
вверх), следовательно, при использовании значений коорди- |
|
ра. Кросс-платформенные инструменты разработчика дают |
наты Y их надо инвертировать. Дополнительные вычисления |
|
последнему доступ к устройству на множестве языков про- |
проводятся над векторами и матрицами, как указано выше. |
|
граммирования, как компилируемых, так и интерпретируемых |
Итак, создадим новый проект таким же образом, |
|
(пока среди последних только два — Python и JavaScript). Кро- |
как прошлый. Дополнительно добавь в него файлы Cinder- |
|
ме того, API имеет стройную и понятную структуру: в каждый |
LeapMotion.h и Cinder-LeapMotion.cpp (см. материалы к ста- |
|
момент времени контроллер снимает изображение, форми- |
тье). В главном классе приложения количество переменных- |
|
рует на основе его кадр и посылает на верхний уровень — |
членов пополнилось, были добавлены: mDevice — ссылка |
|
в прикладную программу, где программист, распарсив кадр, |
на устройство — объект самописного класса, mFrame — клас- |
|
работает с такими сущностями, как руки, пальцы, указатели |
са Frame (мы уже рассматривали этот класс в прошлом раз- |
|
(инструменты) и другое. |
деле), mCamera — объект класса CameraPersp либы Cinder, |
|
Из-за наличия в устройстве двух камер оно часто монтиру- |
также был добавлен метод onFrame (функция обратного вы- |
|
ется на очки виртуальной реальности для создания эффекта |
зова класса-предка), который, принимая объект класса Frame, |
|
дополненной реальности, что достигается благодаря наличию |
делает его текущим — присваивает его переменной-члену |
|
в изображениях, снимаемых камерами, измеренных значений |
mFrame. В методе Setup включаются режимы рисования, сгла- |
|
яркости инфракрасного излучателя, а также калибровочных |
живания линий и полигонов; инициализация камеры: задание |
|
данных, необходимых для коррекции сложного объектива. |
области видимости (в параметрах конструктора), установка |
|
В сегодняшней статье мы затронули тему создания при- |
точки обзора (в методе lookAt); затем создается объект само- |
|
кладных решений, взаимодействующих с устройством по- |
писного класса Device, включающий три необходимых объ- |
|
средством API. Тема эта очень обширна, и рассмотреть |
екта классов: Controller, Device (из пространства имен Leap) |
|
удалось далеко не все — за бортом остались жестикуляция, |
и Listener, кроме того, без мьютекса не обойтись. Вот мы и по- |
|
специальные движения, эмуляция прикосновения и много |
дошли ко второму способу получения кадров от устройства — |
|
чего еще. Все это, а также многое другое, например использо- |
прослушиванию. Наш класс устройства унаследован от клас- |
|
вание контроллера в Windows и Web, интеграция с игровыми/ |
са Listener, который позволяет реализовать эту возможность, |
|
графическими движками, может стать темой для разговора |
то есть мы получаем кадры от контроллера с периодичностью, |
|
в ближайших статьях. Все зависит от тебя — пиши нам, тре- |
соответствующей его работе. Когда контроллер готов пере- |
|
буй продолжения :). А пока — удачи во всех делах и до встречи |
дать кадр, класс Listener вызывает переопределенный нами |
|
на страницах «Хакера»! |