OSG-交互

本文轉至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html
作者寫的比較好,再次收藏,希望更多的人可以看到這個文章
互聯網是是一個相互分形並學習的平臺,我希望我每個人可以將我們認爲有價值的東西,在不損害他人利益的情況下分享給更多的人。



交互過程

viewer的主要的功能是控制場景,它是場景的核心類,如果能響應鍵盤時得到viewer,那麼也可以從鍵盤的響應中控制整個場景。viewer中有一個方法,名爲addEventHandler就是專門做這件事情的。他會加入一個事件處理器。於是我們就想,一定要自己寫一個事件處理器才行,這就必須要了解事件處理器的格式,只要有一個接口就可以瞭解它的格式,這個接口就是:osgGA::GUIEventHandler,於是我們可以寫一個類A從該類公有派生出來,即:class A:public osgGA::GUIEventHandler,在裏面處理好各種操作然後加入到viewer當中,即:viewer.addEventHadler(new A(裏面可以有參數));這樣就可以完成操作。

假如類A是一個事件處理類,那麼加入類A可以這樣理解,如圖3.5:


事件類型與響應

代碼                     值            事件類型
NONE                   0                無事件。
PUSH                     1       鼠標某鍵按下,在上面代碼28行有用到。
RELEASE        2       鼠標某鍵彈起。
DOUBLECLICK    4       鼠標某鍵雙擊。
DRAG          8       鼠標某鍵拖動。
MOVE       16       鼠標移動。
KEYDOWN      32       鍵盤上某鍵按下。
KEYUP        64       鍵盤上某鍵彈起。
FRAME       128    應該是鼠標每幀。沒用過。
RESIZE        256     窗口大小改變時會有的事件。
SCROLL        512     鼠標輪滾動。
PEN_PRESSURE         1024     手寫板的某事件?
PEN_PROXIMITY_ENTER       2048   手寫板的某事件?
PEN_PROXIMITY_LEAVE     4096   手寫板的某事件?
CLOSE_WINDOWS          8192   關閉窗口。
QUIT_APPLICATION         16384   退出程序。
USER                32768   用戶定義。
至於爲什麼都用2的N次方,主要是因爲它的二進制編碼只有一位是一,判斷事件時很好判斷,只要年哪位是一就可以了。


PICK


pick主要是通過鼠標的點擊來拾取一些物體,或者判斷鼠標所點擊的位置在哪裏。Pick實現的思路如下圖所示:


判斷射線與viewer中物體相交的方法爲發出射線並相交。在OSG中有庫函數,osgViewer::View::computeIntersections他共有三個參數:第一個是x屏幕座標,第二個是Y屏幕座標,第三個是存放被交的結點以及相交的座標結點路徑等等相關信息。
判斷相交結點爲我想要的那個結點:只需要判斷存放相交射線交場景的結果集中有沒有要用的結點就可以了。