謝作如




科幻電影中最吸引注意力的界面基本是用手勢操作的。2002年拍攝的電影《少數派報告》中預防犯罪小組的警察使用的界面就是如此,揮揮手就能夠控制屏幕上的內容,確實很震撼。后來其具有的開創性的經典場面,也成為科幻片和其他影視作品爭相模仿的橋段。
十多年過去了,這一手勢控制技術也逐步飛入尋常百姓家。從理論上說,只要有一款攝像頭,就能夠編寫程序體驗簡單的手勢識別。如果擁有Kinect和Leap Motion之類的體感傳感器,你也能像《少數派報告》中男主角一樣,用最自然的手勢和電腦進行交互。例如,你可以用手在空中翻動你的音樂專輯,豎起大拇指它就會為你播放;你只要做出開車的手勢就可以在極品飛車中自由馳騁;你用手指做出手槍的形狀就可以代替鼠標來操縱游戲中的槍;你還可以用它畫畫、玩紙牌等。
當然,只要你會編程,哪怕僅僅懂得最簡單的圖形化編程軟件——Scratch,也能夠編個小游戲,用手勢來控制角色運動,夠酷吧!考慮到Kinect體積比較大,需要在較大的空間才能使用,我選擇了Leap Motion來介紹如何實現手勢控制。
● Leap Motion簡介
Leap Motion是體感控制器制造公司Leap生產的體感控制器。當Leap Motion首次亮相之時,外界認為它承載了一個新穎而獨特的計算機用戶體驗──通過揮舞手指或拳頭來和計算機進行交互,甚至有媒體認為可用Leap Motion替換傳統的鼠標。Leap Motion的體積小,僅一包口香糖大小,通過USB連接電腦后,它會創造出一個4立方英尺的工作空間。在這個空間里,10個手指的動作都會被即時追蹤,誤差在0.01毫米以內,最大頻率是每秒鐘290幀,精確度相當于Kinect的200倍(如圖1)。這樣的精準程度足夠保證用戶順利完成如pinch-to-zoom或控制3D渲染物體等操作。
● Leap motion編程環境配置
1.安裝Leap motion的驅動程序
首先要安裝Leap motion的驅動程序。訪問https://www.leapmotion.com/setup,下載驅動。驅動安裝成功后,還要注冊并登錄Leap motion的網站,具體過程這里不再贅述。
2.安裝Scratch 2.0 Plug-in for Leap Motion
Scratch 2.0 Plug-in for Leap Motion是一位名叫斯蒂芬·豪威爾的愛爾蘭老師開發的插件。這位老師先后為Kinect和Leap motion編寫了for Scratch的插件程序,為Scratch的功能擴展做了很多有趣的工作。
點擊Leap motion官網的“APPS”欄目,在搜索框中輸入關鍵詞“Scratch”,就能找到斯蒂芬·豪威爾編寫的插件“Scratch 2.0 Plug-in for Leap Motion”。登錄網站即可免費安裝,只是服務器在國外,安裝速度有點慢。
插件安裝地址:https://apps.leapmotion.com/apps/scratch-2-0-plug-in-for-leap-motion/windows#,插件安裝成功后,Leap Motion App Home中會出現一個新的應用,如圖2所示。
3.安裝Scratch 2.0并載入相關腳本
顧名思義,“Scratch 2.0 Plug-in for Leap Motion”是Scratch2.0的插件,要先安裝Scratch2.0。在插件的安裝頁面中,作者還提供了Scratch2.0的腳本文件“LeapMotion.json”。打開Scratch2.0,按住“Shift”鍵點擊程序上方的“文件”,彈出的下拉菜單中將多出一項命令“Import experimental HTTP extension”(如圖3)。載入“LeapMotion.json”文件后,Scratch的“更多模塊”中就能看到Leap Motion的專屬指令了(如圖4)。
從原理看,“Scratch 2.0 Plug-in for Leap Motion”相當于是一個橋梁,將Leap Motion和Scratch聯系起來。當電腦接入Leap Motion,并且Scratch正常運行時,Scratch 2.0 Plug-in for Leap Motion的界面會顯示如圖5的提示。
● 編一個手勢控制的程序
Leap Motion能夠精確識別雙手,提供一系列和手勢相關的信息,如每一個手指的X、Y、Z的坐標位置等。其遵循右手坐標系,坐標系中單位與物理世界中的一毫米相對應,坐標原點是設備的中心。X、Z軸組成水平的一個平面,X軸指向設備的長邊,Y軸豎直向上為正方向,Z軸相對屏幕向外是正方向,建議通過Leap Motion的觀察器來熟悉操作(如圖6)。
Scratch 2.0 Plug-in for Leap Motion并沒有提供Leap Motion的全部SDK數據,而是提供了其中最常用的幾類數據,如手和手指的坐標。手勢方面也僅僅提供了是否可見以及手掌是否張開。
為了幫助大家理解這些指令,我進行了分類整理,并進行說明(如下頁表1)。
1.小試身手:用手“抓”住小貓
首先用手勢控制一個角色“hand_open”,當“hand_open”角色遇到小貓角色的時候,用“Hand-1 open”判斷是否處于“抓”的動作。如果是,小貓角色的坐標就跟隨手的坐標移動(如圖7)。
具體的程序代碼說明如表2。
2.自由創意:用手勢控制的“捕魚游戲”
這是五年級小學生編寫的一個小游戲,小作者設計了如下功能:漁網在默認情況下是關閉的,隨著手的運動而移動坐標。當張開手掌時,漁網張開,小魚碰到就被捕。一秒鐘后,漁網自動收回。其中每撒一次網,就要扣除一定的金幣,而捕到的魚可以換金幣(如圖8)。
考慮到LeapMotion的Y軸是手的高度,在電腦前操作容易遮住顯示屏。小作者用Z軸的數據來作為Scratch的Y軸數據。其實代碼還是很簡單,如圖9所示。
通過這兩個范例,大家可能對Scratch2.0加上Leap Motion來玩手勢控制有了一定的了解。斯蒂芬·豪威爾老師在插件頁面中提供了他的幾個簡單范例,值得初學者參考。一般而言,我們很難用Scratch2.0編寫很復雜的手勢控制的程序。但是,只要有足夠的創意和算法基礎,僅僅“Scratch 2.0 Plug-in for Leap Motion”提供的功能,就可以讓中小學生編寫出很酷的手勢控制方面的應用來。如果具有足夠的數學功底,完全可以試試一些簡單的手勢識別。如果你對Leap Motion手勢控制編程感興趣,請關注下一篇,跟我一起繼續研究更加有趣的作品。
如果對相關內容感興趣,請關注主持人博客。