国产福利在线高清导航大全-国产福利在线-国产福利影视-国产福利一区二区麻豆-成熟少妇大片免费看-成熟女人毛片WWW免费版在线

當前位置:首頁 > 觸控技術 > 多點觸摸技術
多點觸摸技術

軟件和應用程序3

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


 

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


 

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


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


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

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


 

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


 

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


 

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


 

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


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


 


相關文章
精彩評論:
0  相關評論
主站蜘蛛池模板: 陆河县| 九龙城区| 高雄县| 高淳县| 金坛市| 海安县| 阿勒泰市| 诏安县| 阳高县| 资兴市| 湟源县| 道真| 德江县| 会宁县| 区。| 淮阳县| 二连浩特市| 东山县| 望都县| 安仁县| 聊城市| 昆明市| 云浮市| 邮箱| 锡林郭勒盟| 来凤县| 电白县| 平凉市| 明水县| 汉源县| 长治市| 岐山县| 英德市| 库伦旗| 依安县| 龙南县| 金门县| 全椒县| 阿克苏市| 南漳县| 高州市|