謝作如
毫無疑問,Leap Motion是一款很有趣的體感控制器。借助于斯蒂芬·豪威爾“Scratch 2.0 Plug-in for Leap Motion”插件,中小學(xué)生用Scratch2.0,就能編寫出很酷的手勢控制方面的應(yīng)用來。在上期的文章中,我借助“用手‘抓’住小貓”和“深海捕魚”兩個范例,初步介紹了手勢控制方面的編程。在這期的文章中,我們繼續(xù)研究稍微復(fù)雜的手勢識別功能的實現(xiàn)。
需要提示的是,Scratch2.0的文件能夠保存其原先使用的第三方插件信息。你只要打開原來保存的手勢控制程序,就不需要再次去載入“LeapMotion.json”腳本文件了。這樣一來,我們編寫需要第三方插件的Scratch程序就比較方便了。
用手勢實現(xiàn)放大和縮小功能
通過手勢控制圖片或者網(wǎng)頁的放大和縮小,是手機觸控屏上的常見應(yīng)用。這一功能雖然常見,但在普通的觸控屏上實現(xiàn)起來并不容易,因為這涉及多點觸控。Leap Motion可以識別雙手,剛好可以讓我們體驗這一好玩的功能。
以下是一個通過手勢控制小魚大小的程序,具體功能為:雙手握拳,然后改變雙手之間的距離,屏幕上的小魚也就根據(jù)距離的變化,自行放大或者縮小,其界面如圖1所示。
程序功能分析:
①首先我們需要判斷雙手是否握拳,用“Hand-1 Open?”和“Hand-2 Open?”不成立就可以判斷。原理很好理解,但代碼拼接起來有點長,這也是圖形化編程語言的最大不足。
②而后要判斷雙手之間有沒有改變距離。我使用d1和d2兩個變量,d1記錄的是上一次的距離,d2記錄的是當(dāng)前的距離。然后將d2除以d1的值與角色的原大小相乘,并設(shè)定角色大小。這樣就能夠用動態(tài)的雙手距離控制角色大小了。
需要注意的是,如果雙手不處于“握拳”狀態(tài)時,d1的值需要初始化為0。不然,這會導(dǎo)致你無法連續(xù)做縮放角色的操作。完整的代碼如圖2所示。
和電腦玩“石頭剪刀布”
“石頭剪刀布”是大家最熟悉的猜拳游戲了,和電腦玩“石頭剪刀布”游戲的程序也多如牛毛。但是,那些程序無非是用鼠標(biāo)鍵盤選擇一個按鈕,然后和電腦出的隨機數(shù)進(jìn)行比較,無趣得很。你甚至不知道電腦是不是耍了什么手段,畢竟電腦永遠(yuǎn)是在你選擇后才暗中“出拳”。你見過有誰真正用劃拳的形式和電腦玩“石頭剪刀布”嗎?
我們可以借助Leap Motion,做一個玩家和電腦可以“公平”玩猜拳的手勢游戲。游戲設(shè)定為:當(dāng)?shù)褂嫊r結(jié)束,玩家和電腦同時“出拳”,然后電腦識別出玩家的手勢,根據(jù)自己的出拳結(jié)果,判斷輸贏。
游戲的核心功能并不復(fù)雜。首先要讓電腦能夠判斷玩家出的拳(手勢)是石頭還是剪刀或者布。這三個手勢中,比較麻煩的是“剪刀”,這需要進(jìn)行多次測試,看Leap Motion的識別結(jié)果是否準(zhǔn)確。比如我就用下頁圖3的代碼,分別判斷當(dāng)玩家出“剪刀”的時候,五個手指的狀態(tài)分別是處于什么情況,記錄并分析。
也許是插件的BUG或者是Leap Motion的識別存在某些不足,“剪刀”這一手勢,插件反饋的往往不是“食指和中指”可見,反而是“大拇指和食指”可見。經(jīng)過多次測試,我發(fā)現(xiàn)如下表所示的規(guī)律:
可能有人會問,對于“石頭”的判斷,為什么不直接用“‘hand-1 Open’不成立”呢?其實,對于Leap Motion來說,“剪刀”也是“‘hand-1 Open’不成立”的。既然我們僅僅是為了區(qū)分三種手勢,也可以更簡單點,將三種情況合并起來判斷,如圖4。
需要注意的是,玩家出拳前最好要先把手勢做標(biāo)準(zhǔn),然后展示在Leap Motion的上方,不要太靠近。尤其不能等手到了固定的位置再做出手勢,這樣容易導(dǎo)致Leap Motion誤判。在實際的測試中,Leap Motion還是能讓我滿意的,識別的準(zhǔn)確率能達(dá)到90%。
好了,既然三種手勢都能正確識別,這個程序的核心功能就實現(xiàn)了。我們可以優(yōu)化一下程序,把其他功能完善起來。限于篇幅,具體的代碼就不再贅述了。具體界面如圖5-圖9所示。
看到“后出”提示了嗎?在這個游戲中,我們再也不用擔(dān)心電腦作弊了,因為它甚至?xí)饶阆瘸?。?dāng)然,如果你不及時出拳,程序會判定你“后出”的。總之,誰也別想耍賴。
借助這兩個范例,我們初步實現(xiàn)了一些有趣的手勢識別功能,但是也發(fā)現(xiàn)“Scratch 2.0 Plug-in for Leap Motion”插件存在很多不足。如果你具有一定的編程能力,還可以下載插件源碼,增加相應(yīng)的功能,讓Scratch2.0的手勢控制更加強大。我們希望有更多的高手,在他人的開源代碼基礎(chǔ)上,增加新的功能后再開源出去。如果你用Leap Motion識別出更多的手勢,請別忘了分享你的代碼。
如果對相關(guān)內(nèi)容感興趣,請關(guān)注主持人博客。