Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
30.24 Mб
Скачать

 

 

 

 

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 вызывает переопределенный нами

 

на страницах «Хакера»!

Соседние файлы в папке журнал хакер