軟件和應用程序3

      作者: Multitouch     時間:2013-07-08     源于:中國觸摸屏網(wǎng)    總點擊:
      【導讀】:Python 是一種可用戶于多種類型軟件開發(fā)的動態(tài)面向?qū)ο缶幊陶Z言,它提供了強大的與其它語言和工具相互協(xié)作支持,擁有廣泛的標準庫,而且你可以在幾天之內(nèi)上手。很多Python 程序員都反映使用Python 獲得了更高的生產(chǎn)力,更強壯的代碼以及更易維護的特性。

          2.4 Python
          Python 是一種可用戶于多種類型軟件開發(fā)的動態(tài)面向?qū)ο缶幊陶Z言,它提供了強大的與其它語言和工具相互協(xié)作支持,擁有廣泛的標準庫,而且你可以在幾天之內(nèi)上手。很多Python 程序員都反映使用Python 獲得了更高的生產(chǎn)力,更強壯的代碼以及更易維護的特性。
          2.4.1 導讀
          這一節(jié)來闡述兩種偉大的技術(shù):多點觸摸用戶界面和Python 編程語言。重點講一下如何用Python 開發(fā)多點觸摸應用程序。
          現(xiàn)在介紹一下Python 里面的幾個模塊PyMT 以及演示一下它的范例,然后嘗試去寫一下多點觸摸輸入的小程序。PyMT 是一個開源的、用于快速開發(fā)多點觸摸應用程序的Python 模塊。
          在許多方面,Python 和多點觸摸在使電腦更容易操作這個方面用諸多的相同點。雖然作為幾種編程語言,Python 需要更先進的技術(shù),來讓開發(fā)者能夠快速而又輕松地編寫代碼。Python 常常說比其它語言更容易學習,許多Python 程序員也反映使用這種語言使他們更專注地解決問題、實現(xiàn)目的,而不是拘泥于繁雜的語法和嚴格的語言屬性。Python 強調(diào)其代碼的可讀性和可以從開源社區(qū)獲取大量的可用模塊,Python 試圖用簡單和有趣的編程方式構(gòu)建多點觸摸用戶界面,來讓電腦變得更加自然和直觀地使用。
          雖然多點觸摸的實用性得到了快速的發(fā)展,但是就目前的互動方式和應用來看,多點觸摸還有極大的潛力等待我們?nèi)ネ诰颉S绕涫乾F(xiàn)在很多的多點觸摸項目仍然處于在實驗室內(nèi)的階段,所以能夠最大限度的快速構(gòu)建多點觸摸交互和應用藍圖是非常重要的。Python 的動態(tài)語言特性和快速開發(fā)的能力以及社區(qū)里的大量模塊,都使得Python 成為快速開發(fā)多點觸摸交互和應用的理想語言。
          2.4.2 Python多點觸摸的模塊和項目(Modules and Projects)
          以下簡要概述Python 里面涉及到多點觸摸的模塊和項目。
          PyMT
          PyMT 是一個用于開發(fā)多點觸摸的Python 模塊,可以與OpenGL 通信。它最初是一個愛荷華州大學的研究項目,最近在很多團體和個人的大力支持和共同開發(fā)下,PyMT 一直保持著較快地發(fā)展。它可以運用在Windows,OS X 和Linux操作系統(tǒng)下,PyMT 的許可證是GPL License。我們將在下賣面的章節(jié)中詳細探討PyMT。
          touchPy
          Python 框架是與TUIO 協(xié)議協(xié)同工作的。touchPy 監(jiān)聽TUIO 的輸入,并執(zhí)行觀察員模式(Observer pattern),開發(fā)人員可以使用其子類。觀察員模式使得touchPy 平臺和模塊并不可知,例如它并不關(guān)心是哪一個框架來繪制屏幕。AlexTeiche 為它寫了一個很重量級的教程。
          PointIR
          PointIR 是在2008 年P(guān)yCon 上演示的多點觸摸系統(tǒng),基于Python。雖然當年看上去非常有希望,但是最近似乎從網(wǎng)絡上消失了(搜索試試?)。授權(quán)信息也不清楚。
          libAVG
          根據(jù)官網(wǎng)的描述:“libAVG 是一個高層次的媒體開發(fā)平臺,專注于互動裝置。”雖然從嚴格的意義上講,它不算是多點觸摸模塊。但是它卻能夠接收TUIO的信息和追蹤觸點,所以可以作為多點觸摸系統(tǒng)來使用。libAVG 可以在Mac OSX 和Linux 上運用,它也是開源的,許可證是LGPL。
          pyTUIO
          一個用于接收和分析TUIO 輸如的Python 模塊。在MIT 許可證下發(fā)布。
          2.4.3 PyMT
          PyMT 是一個用來開發(fā)多點觸摸富媒體OpenGL 應用的Python 模塊。主要目標是使開發(fā)變得更新奇,簡便和快速自定義界面。本節(jié)將介紹討論PyMT 詳細的結(jié)構(gòu),并使用它來作為一個例討論一些參與編寫多點觸摸界面的若干問題。
          每一個有用的程序都做過兩件事:獲得輸入和提供輸出。如果沒有輸入,程序就只會輸出相同的結(jié)果(例如"Hello World!"),那么這個程序是沒有用的。如果沒有輸出,那么沒人知道程序在做什么,或者根本就沒有做什么。運用在多點觸摸顯示屏上的程序,最主要的輸入方式就是觸摸。圖形的顯式就是其主要輸出。PyMT 嘗試使輸入和輸出變得簡單和靈活。在處理輸入方面,PyMT 將TUIO 協(xié)議包裝成一個事件驅(qū)動的框架,輸出方面則是基于OpenGL,這樣的話就可以使用圖形硬件加速,在繪制圖形上獲得最大的自由性。
          2.4.4 PyMT的構(gòu)造
          圖5 展示的是PyMT 的主要結(jié)構(gòu),如前面所講的,它使用TUIO/OpenGL作為輸入/輸出。當前版本的PyMT 依靠pyglet,這是一個跨平臺的OpenGL 窗⼝和多媒體Python 庫,特別是pyglet 的多媒體功能使得處理圖像、音頻和視頻變得非常容易。大多數(shù)的媒體問件可以裝載至單線(single line)的Python 代碼中(也包括繪制的OpenGL 內(nèi)容的重現(xiàn))。


       

          圖5:PyMT 結(jié)構(gòu)。PyMT 建立在Pyglet 基礎(chǔ)之上,其中規(guī)定了OpenGL 的窗⼝和多媒體加載的各種問件格式。它同樣通過TUIO 客戶端監(jiān)聽輸入信息。PyMT 將這些技術(shù)組合在一起,提供了一個面向?qū)ο蟮臉?gòu)件庫和分級系統(tǒng)布局和事件傳播。
          2.4.5OpenGL
          利用OpenGL 作為繪圖后端利弊并存。雖然它可以在2D 和3D 渲染上擁有高性能和很好的靈活性,但是在畢竟處于比較低級的狀態(tài)。而且它的學習曲線比較陡峭,也需要有基本的計算機圖形學知識。
          PyMT 試圖抵消需要比較高級的知識才能駕馭的OpenGL 繪圖功能,提供了基本的繪圖功能。PyMT 包括drawCircle 、drawRectangle 、drawLine 和drawTexturedRectangle 函數(shù)以及其它無需高級OpenGL 知識的功能。使用OpenGL 作為基本的渲染引擎,可以使高級用戶充分控制他們的程序的可視化輸出。PyMT 也提供了輔助函數(shù)和類去幫助實現(xiàn)高級的OpenGL 編程。例如,PyMT可以用一行程序?qū)崿F(xiàn)建立一個幀緩沖對象(Frame Buffer Object)和從glsl 著色。PyMT 還能利用引擎來處理投影矩陣和布局轉(zhuǎn)變,這樣就可以在不用調(diào)節(jié)他們參數(shù)的情況下直接運行。這個構(gòu)思的原因是希望能夠在大多數(shù)情況下能夠最大限度的方便運用,但是如果需要用到更高級的技術(shù)或者需要自定義相關(guān)技術(shù)則必須要用到OpenGL 來編寫。
          對OpenGL 的描述還有其它更加詳細的資料,關(guān)于OpenGL 的簡單信息可以從[12][13]查閱到,標準的參考書是“The Red Book”,或者從nehe.gamedev.net網(wǎng)站上查閱經(jīng)典的OpenGL 指導。
          2.4.6Windows、Widgets、Events
          大多數(shù)圖像用戶界面的開發(fā)包和框架都有一個叫作“工具(widget)”的概念,一個“工具(widget)”可以在同一個圖形用戶界面中構(gòu)建模塊,它是一個富有交互性及可視化的元素。在維基中是如下定義的:


       

          PyMT 和其它GUI 工具板一樣使⽤類似的概念,它以類似框架式的大部分提供一系列可以用于多點觸摸的工具。但PyMT 的重點在于讓程序員很容易地支持自定義工具以及嘗試開發(fā)新的互動技術(shù),而不是提供一套標準的工具。這是來自如下建議和設想的主要的動機:
          􀁺 在用戶自然界面(NUI)里面只有極少數(shù)的“工具”和交互設計應用證明了自己是標準的。
          􀁺 NUI 本身就不同于傳統(tǒng)的GUI/WIMP(窗⼝、圖標、菜單、指向設備)
          􀁺 NUI 是非常具有內(nèi)容化的,例如:可視化信息和交互應用是基于用戶交互背景的。
          􀁺 傳統(tǒng)的鼠標鍵盤系統(tǒng)已經(jīng)無法提供實時的多用戶協(xié)和操作,需要顛覆式地構(gòu)思新的交互界面。
          PyMT 運用時以樹狀目錄組織widget. 根目錄是應用程序窗⼝(一般是MTWindow). Widget 可以通過MTwidget 基類的add_widget 方法加進這樣的目錄中或者加進其他widget 中.各種事件如on_draw, on_resize, mouse event 和touchevent 可以通過這個樹狀目錄到達所有的widget. 程序員可以利用這些層級機構(gòu)來定義各種容器(container), 用以處理布局和控制widget 對事件的響應.
          PyMT 提供了豐富的功能強大的widget 和實用的對象(object). 比如,所有的widget 可以用CSS 來定義風格. 除了用add_widget 來生成widget 之外,還可以用XML 來定義層級結(jié)構(gòu),然后自動生成widget. 由于PyMT 的功能實在太多,無法意義介紹,詳情請參閱PyMT API 文檔.
          接下來的小例子將嘗試展示PyMT 的關(guān)鍵概念. 圖2 展示了該例子的最終效果,用一只手獲取5 個輸入點. 這段代碼可以分為4 個部分. 評價一個NUI 交互系統(tǒng)的唯一也是最有效的方法就是親自去做,去體驗.
          1. 導如PyMT 并初始化參數(shù):第一行代碼告訴python,我們要用PyMT,這行代碼將會加載所有的PyMT 對象和函數(shù)。這段代碼同時還設置了一個名叫touch_positions 的變量。這個變量用以存儲觸摸事件的坐標位置。
          2. 定義一個新的類,名叫TestWidget:這個類繼承自MTWidget 并定義了4個事件處理器。on_touch_down 和on_touch_up 事件處理器更新觸摸位置。on_touch_up 處理器從觸摸列表中刪除觸摸。draw 方法會在每個觸摸事件的當前位置生成一個半徑為40 的圓。這個圓通過PyMT 的drawCircle 方法,并調(diào)用touch_positions 的值生成。
          3. 創(chuàng)建一個窗⼝來裝載widget:MTWindow 是一個應用程序窗⼝,你可以通過add_widget 方法來加載widget。被加載的widget 會通過窗⼝接收touch 和draw事件,并渲染該窗⼝。
          4. 啟動程序:runTouchApp 函數(shù)會啟動PyMT 的主程序,同時任命窗⼝,打開TUIO 偵聽器,并開始發(fā)送事件。


       程序1:PyMT 程序⽰例,在每個觸點處⽣成⼀個紅⾊的圓。   

      圖6:程序1 所⽰程序運⾏截圖。5 個觸點(屏幕分辨率:640x480)

          2.4.7 多點觸摸輸入編程
          基于多點觸摸設備的編程和交互設計與基于目標的界面的情況完全不同。前面章節(jié)討論了NUI(自然交互界面)與傳統(tǒng)的基于GUI(圖形界面)的WIMP的區(qū)別。主要的區(qū)別在于多點觸摸給交互界面帶來的無限的拓展和可能性,同時也讓編程變得更加復雜。
          TUIO 方式,以及其他多點觸摸協(xié)議和框架定義了3 種基本的觸摸消息/事件。包括新的觸摸事件,現(xiàn)有觸摸事件的移動,觸摸事件的移除。這些消息總是被標明“touchID”,這樣程序以及這些事件調(diào)用函數(shù)就能把這些觸摸事件各自區(qū)分開來。如程序1 中所示,這些觸摸事件以下面所示的方式到達PyMT:
          · on_touch_down(touches, touchID, x, y)
          · on_touch_move(touches, touchID , x, y)
          · on_touch_up(touches, touchID, x, y)
          每個事件都攜帶著touchID 和x,y 坐標值。通過這些touchID 和坐標值,系統(tǒng)就區(qū)目⽬前所有的觸點及其位置。實際上,系統(tǒng)不僅能區(qū)分目前所有觸點的位置,還記錄著目前每個觸點的移動和加速度,這些都由TUIO 協(xié)議定義。PyMT也為TUIO 對象提供on_object_*事件(例如:圖形標簽的識別)。
          很明顯,解釋多點觸摸要比處理單一指點設備如目標復雜得多。任何一個觸點都會影響到用戶界面,隨后的事件處理器在決定如何處理觸摸事件之前必須兼顧所有其他可能發(fā)生的相互作用戶。
          在進行PyMT 編程的時候,一些基本的編程技巧已經(jīng)被證實很有幫助。例如,讓某個widget 對某個特定的觸摸擁有所有權(quán)在很多案例中被證明很有效。當使用這個技巧的時候,其他的widget 會忽略某個特定touch_ID 所對應的touch_move 或者touch_up 事件。只有對這個事件擁有所有權(quán)的widget 才會處理這些事件。
          基本上,多點觸摸和基于多點觸摸的交互界面潛力無限,如果一定要有什么限制的話,那么,這些限制就是我們的創(chuàng)造力和想象力。多點觸摸的手勢有無窮的組合方式。在接下來的例子里,你將看到,這些手勢及其組合可以形成很多直觀的交互操作,但是,這也意味著邏輯和算法變得更加復雜,更加困難。
          2.4.8 例子:實現(xiàn)旋轉(zhuǎn)/縮放/移動
          這一部分,我們將討論如何實現(xiàn)一個著名的操作。旋轉(zhuǎn)/縮放/移動(圖7)是最常見的多點觸摸演示示例。這種直觀的,用兩個手指旋轉(zhuǎn)/縮放/移動一個二維物體的方式,和我們在桌面上移動一張紙的情況很相似。我對這個方式感覺很直觀,很自然然,因為兩個觸點始終在物體上一開始的那個位置,無論手指移動到哪⾥。


       

          在PyMT 中,這個交互方式以ScatterWidget 對象實現(xiàn),你可以在這個對象中添加其他widget,讓他們成為scatter widget 的一部分。誠然,這個交互方式已經(jīng)用了太多次了,有人或許會說這個方式已經(jīng)用爛了。我們在這里討論這種交互方式不是為了炫耀,而是因為它是一個非常不錯的例子,一個典型的證明多點觸摸編程復雜性的例子。盡管目前只用了兩個觸點,而整個交互非常自然,但是這里面涉及到的計算和數(shù)學知識已經(jīng)比鼠標交互復雜了很多。
          為了理解這個交互的具體實現(xiàn),需要對矩陣變換有基本的了解。通過矩陣乘法,任何變形都可以通過一個矩陣實現(xiàn)(一般來說是4x4 矩陣)。比如一個矩陣表示沿x 軸移動5 個單位,可以乘上一個繞y 軸旋轉(zhuǎn)90 度的矩陣。得到的矩陣則表示在沿x 周移動5 個單位的同時,繞y 軸旋轉(zhuǎn)90 度。更多矩陣相關(guān)信息,參見[18]。
          2.4.9 用矩陣變換來畫圖
          程序2a 是做旋轉(zhuǎn)/縮放/移動的第一部分。這一部分用于生成對象。Transform_mat 是一個變形矩陣。到目前為至它只用來保存標準矩陣,讓所有的點保持不變。基于觸點的位置和移動,對變形矩陣進行修改,達到改變對象的目的。


       
          程序2a.旋轉(zhuǎn)/縮放/移動實例。當生成對象的時候,應用了一個變形矩陣,這個矩陣會隨著觸點位置的變化發(fā)生改變。詳細的代碼參見pymt/ui/scatter.py 參考文獻[2]
          2.4.10 確定參數(shù)并計算變形
          接下來的問題就是決定如何進行變換對象的變形矩陣。圖8 描述了需要變換的部分參數(shù)。重要的一點是,對任何一個給定的事件,兩個觸點中,只有其中一個可以移動。因為,每個事件一次只能傳送一個觸點的信息。
          為了計算變換,需要以下參數(shù)。事件發(fā)生前和事件發(fā)生后兩個觸點的距離(d1 和d2)。角度R,用來計量對象的旋轉(zhuǎn)角度。旋轉(zhuǎn)和縮放中芯點Pi(兩個觸點的其中一個)

       
          圖8 旋轉(zhuǎn)/縮放/移動。兩個觸點(A 和B),對多個參數(shù)進行計算。縮放值(d2/d1), 旋轉(zhuǎn)角度(R), 旋轉(zhuǎn)和縮放中心(Pi).每次只有一個觸點位置發(fā)生改變(A=Pi 或者B=Pi)
          通過對參數(shù)的計算, 變形矩陣會做出相應的修改。程序2 展示了PyMT/OpenGL 是如何完成這些的。具體的步驟如下:
          1. 初始矩陣被裝載進transform_mat
          2. 通過變換,讓旋轉(zhuǎn)中心的坐標為(0,0),因為,在OpenGL 中,旋轉(zhuǎn)和縮放總是圍繞原點進行。
          3. 繞z 軸旋轉(zhuǎn)(z 軸垂直屏幕)
          4. 縮放
          5. 把所有的物體移動到當初的位置
          另外一件值得注意的事是,對象沒有發(fā)生移動(平移)。運用這種技術(shù),物體的運動通過繞固定的點旋轉(zhuǎn)或者在不同方向上縮放實現(xiàn)。如果要移動對象的話, 比如用一個手指拖動, 那么這個拖動的動作必須添加到PyMT 的ScatterWidget 類中去。為了保持例子的簡潔,這里就不深入探討。

       
          程序2b。應用變形參數(shù)示例。這個函數(shù)把變形參數(shù)應用到變形矩陣上。完整的程序見pymt/ui/scatter.py 參考文獻[2].
          2.4.11 觸摸位置轉(zhuǎn)譯成計算參數(shù)
          最終,程序必須根據(jù)觸摸事件提供的位置單獨計算參數(shù)。程序2c 展示了相應代碼。為了簡潔,這段代碼假設get_second_touch 函數(shù)用于獲取第一個觸點的信息。這樣的程序可以通過一個庫來跟蹤記錄touchID,確保每次只有兩個點在這個庫中,然后返回與被傳遞的參數(shù)不同的那個。
          這段代碼也假設了一些基本的矢量函數(shù),用于計算兩點間的距離和角度。具體的實現(xiàn)參見PyMT 的vector 類[2]。或者參考[20][21]。這個計算基本上只是兩個向量的大小和乘積。
          旋轉(zhuǎn)的角度通過A1-B 和A2-B 得出。縮放的比例通過d2/d1 得出。

          程序2c。計算旋轉(zhuǎn)/縮放/移動參數(shù)的程序示例。詳細代碼見pymt/ui/scatter.py 附錄[2]。  

       

      相關(guān)閱讀:3D打印    模具產(chǎn)業(yè)    微鑄鍛技術(shù)    石墨烯    OLED面板    夏普    iPhone 8    半導體    蘋果    
      關(guān)于我們 | 廣告服務 | 聯(lián)系我們 | 版權(quán)聲明 | 隱私政策 | 網(wǎng)站地圖 | 友情鏈接 | 歡迎投稿 | 加入收藏 | 意見反饋 | 經(jīng)銷商加入
      網(wǎng)站廣告、經(jīng)銷商加盟、觸摸屏軟件銷售: 028-85108892 13183843395 028-66219290 聯(lián)系人: 張小姐 產(chǎn)品購買聯(lián)系方式如下:
      地址:成都市高升橋東路2號高盛中心1109室 電話: 028-85108892 13183843395 028-66219290
      版權(quán)所有 Copyright(C) 2003-2015 All rights reserved 中國觸摸屏網(wǎng) 電子郵件: 51touch@126.com touch8@gmail.com
      業(yè)務合作QQ:觸摸屏技術(shù),觸摸屏報價,觸摸屏軟件咨詢 43361182 觸摸屏軟件制作與技術(shù)支持:觸摸屏軟件,觸摸查詢系統(tǒng),觸摸查詢軟件 893008608 媒體合作QQ: 893008608

      2000人超級QQ觸摸屏群:59897879 171220106


      分享到